2015-01-12 3 views
16

भेजते समय मैंने ओएथ इन सी # के साथ वेब एपीआई की सुरक्षा के लिए एक ट्यूटोरियल का पालन किया है।एपीआई एंड पॉइंट लौटने "इस अनुरोध के लिए प्राधिकरण से इनकार कर दिया गया है।" जब बेयरर टोकन

मैं कुछ परीक्षण कर रहा हूं और अब तक मैं /token से सफलतापूर्वक पहुंच टोकन प्राप्त करने में सक्षम हूं। मैं इसका परीक्षण करने के लिए "उन्नत रीस्ट क्लाइंट" नामक क्रोम एक्सटेंशन का उपयोग कर रहा हूं।

{"access_token":"...","token_type":"bearer","expires_in":86399} 

यह है कि मैं क्या /token से वापस पाने के लिए है। सब कुछ अच्छा लग रहा है।

मेरा अगला अनुरोध अपने परीक्षण एपीआई नियंत्रक के लिए है:

namespace API.Controllers 
{ 
    [Authorize] 
    [RoutePrefix("api/Social")] 
    public class SocialController : ApiController 
    { 
     .... 


     [HttpPost] 
     public IHttpActionResult Schedule(SocialPost post) 
     { 
      var test = HttpContext.Current.GetOwinContext().Authentication.User; 

      .... 
      return Ok(); 
     } 
    } 
} 

अनुरोध एक POST है और शीर्ष लेख है:

Authorization: Bearer XXXXXXXTOKEHEREXXXXXXX 

मैं: Authorization has been denied for this request. JSON में लौट आए।

मैंने एक जीईटी करने की भी कोशिश की और मुझे उम्मीद है कि मैं क्या उम्मीद करूंगा, कि विधि समर्थित नहीं है क्योंकि मैंने इसे लागू नहीं किया है।

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     context.Validated(); 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 

     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     using (var repo = new AuthRepository()) 
     { 
      IdentityUser user = await repo.FindUser(context.UserName, context.Password); 

      if (user == null) 
      { 
       context.SetError("invalid_grant", "The user name or password is incorrect."); 
       return; 
      } 
     } 

     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "User")); 

     context.Validated(identity); 

    } 
} 

किसी भी मदद की बहुत अच्छा होगा:

यहाँ मेरी प्राधिकरण प्रदाता है। मुझे यकीन नहीं है कि यह अनुरोध है या कोड गलत है।

संपादित करें: यहाँ है मेरी Startup.cs

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var config = new HttpConfiguration(); 
     WebApiConfig.Register(config); 
     app.UseWebApi(config); 
     ConfigureOAuth(app); 
    } 

    public void ConfigureOAuth(IAppBuilder app) 
    { 
     var oAuthServerOptions = new OAuthAuthorizationServerOptions() 
     { 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
      Provider = new SimpleAuthorizationServerProvider() 
     }; 

     // Token Generation 
     app.UseOAuthAuthorizationServer(oAuthServerOptions); 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 

    } 
} 

उत्तर

27

जारी करना बहुत सरल है।

public void Configuration(IAppBuilder app) 
{ 
    ConfigureOAuth(app); 
    var config = new HttpConfiguration(); 
    WebApiConfig.Register(config); 
    app.UseWebApi(config); 
} 

आपकी कॉन्फ़िगरेशन के ओडिन पाइपलाइन ऑर्डर के लिए काफी महत्वपूर्ण है। आपके मामले में, आप OAuth हैंडलर से पहले अपने वेब एपीआई हैंडलर का उपयोग करने का प्रयास करते हैं। इसके अंदर, आप अपने अनुरोध को मान्य करते हैं, आपको सुरक्षित कार्रवाई मिलती है और वर्तमान Owin.Context.User के विरुद्ध इसे सत्यापित करने का प्रयास करती है। इस बिंदु पर यह उपयोगकर्ता मौजूद नहीं है क्योंकि ओथ हैंडलर के साथ टोकन से सेट किया गया है जिसे बाद में बुलाया गया है।

+0

यदि आप पाइपलाइन में वेबएपी पंजीकृत नहीं कर रहे हैं तो आप यह कैसे करेंगे? मैं सिर्फ डिफ़ॉल्ट वेब एपीआई टेम्पलेट के साथ काम कर रहा हूं। अनुरोध ठीक करें, POST अनुरोध मुझे 401 दें। टोकन एक जैसा है। – mwijnands

+1

यह मुझे पकड़ा! इस उत्तर को पोस्ट करने के लिए समय निकालने के लिए धन्यवाद। – heymega

+0

इस मुद्दे के कारण खोजने का प्रयास करने के बाद मैंने कुछ घंटों बर्बाद कर दिए। – Tomino

2

आप इस स्कीमा के साथ एक दावा जोड़ने के लिए:

http://schemas.microsoft.com/ws/2008/06/identity/claims/role 
करने के लिए

सबसे अच्छी बात दावों के पूर्व निर्धारित सेट का उपयोग करने के लिए है:

identity.AddClaim(new Claim(ClaimTypes.Role, "User")); 

आपमें ClaimTypes पा सकते हैं 10।

एक और बात आप ध्यान में रखना होगा अपने नियंत्रक/कार्रवाई में फिल्टर भूमिकाओं है:

[Authorize(Roles="User")] 

आप एक सरल नमूना अनुप्रयोग, एक jQuery ग्राहक here साथ Owin स्वयं के द्वारा होस्ट पा सकते हैं।

+0

मैंने जोड़ा: 'पहचान। Addclaim (नया दावा (दावा प्रकार। रोल," उपयोगकर्ता ")); 'कोई फायदा नहीं हुआ। क्या इससे कोई फर्क पड़ता है कि उपयोगकर्ता पूंजी है? मैंने आपकी टिप्पणी देखने से पहले इसे जोड़ा। मुझे नहीं लगता कि इससे कोई फर्क नहीं पड़ता। मैं आपका लिंक देखूंगा। –

+0

यह स्थिर है और कुछ भी हो सकता है। – LeftyX

+0

मैंने अपने नियंत्रक में भूमिका शामिल करने के लिए '[अधिकृत करें] 'को बदलने की कोशिश की, लेकिन मुझे अभी भी इसे अधिकृत करने के लिए नहीं मिल रहा है। मैंने "उपयोगकर्ता" भूमिका में एक नया उपयोगकर्ता बनाया और सफलतापूर्वक एक नया टोकन मिला। आपके सुझाए गए परिवर्तन के साथ ऊपर अपना कोड अपडेट किया गया। –

0

कि सह मौजूद अन्य Owin विधानसभाओं के साथ उचित नहीं है "System.IdentityModel.Tokens.Jwt" के संस्करण की तरह लग रहा।

यदि आप "Microsoft.Owin.Security.Jwt" संस्करण 2.1.0 का उपयोग कर रहे हैं, तो आपको संस्करण 3.0.2 की "System.IdentityModel.Tokens.Jwt" असेंबली का उपयोग करना चाहिए।

पैकेज प्रबंधक कंसोल से, कोशिश: अपने Owin पाइपलाइन की आदेश बदलें:

Update-Package System.IdentityModel.Tokens.Jwt -Version 3.0.2 
संबंधित मुद्दे

 संबंधित मुद्दे