2015-11-18 18 views
6

के साथ एएसपी.NET वेब एपीआई ओविन टोकन आधारित प्रमाणीकरण के साथ मैं वेब एपीआई 2 का उपयोग कर रहा हूं। केवल एक चीज जो काम नहीं कर रही है वह भूमिकाओं पर आधारित प्राधिकरण है।भूमिका आधारित प्राधिकरण

AuthorizationServerProvider.GrantResourceOwnerCredentials की मेरी कार्यान्वयन में यह कैसे मैं भूमिकाएं सौंप है:

identity.AddClaim(client.ApplicationType == ApplicationTypes.WebClient 
      ? new Claim(ClaimTypes.Role, "user") 
      : new Claim(ClaimTypes.Role, "admin")); 

लेकिन नियंत्रक का उपयोग करने में [प्रमाणित (भूमिकाओं = "उपयोगकर्ता")] सिर्फ एक प्राधिकरण से इनकार संदेश ग्राहक के लिए देता है। मैं चर की जाँच की और यह क्या है enter image description here

अंदर तो भूमिका वहाँ हो रहा है है, लेकिन user.Claims खाली और IsInRole ("उपयोगकर्ता") है भी नकारात्मक देता है।

मुझे यहां स्टैक ओवरफ्लो और तर्क-आधारित पर कई प्रश्न मिले हैं, मुझे नहीं पता कि मुझे क्या याद आया। केवल बात यह है कि मेरे दिमाग में आता अधिकृत कमान अधिलेखन है लेकिन यह कहने की जरूरत नहीं की तरह है के रूप में भूमिका आधारित प्राधिकरण पहले से एकीकृत किया जा रहा है ...

संपादित करें:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin") ?? "*"; 
     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin }); 

    Client client; 
    using (var repo = new AuthRepository()) 
    { 
     client = repo.FindClient(context.ClientId); 
     if (client.ApplicationType != ApplicationTypes.Service) 
     { 
      var user = await repo.FindUser(context.UserName, context.Password); 

      if (user == null) 
      { 
       context.SetError("invalid_grant", "The user name or password is incorrect." + context.UserName); 
       return; 
      } 
     } 
} 
: यह मेरा workig विधि कैसा दिखता है

उत्तर

3

सीधे भूमिका दावा जोड़ने मत करो, UserManager बजाय का उपयोग करें: इस तरह (AspNetUserRoles या जो भी आप द्वारा कॉन्फ़िगर किए गए) भूमिका कायम हो जाएगा

UserManagerInstance.AddToRole(userId, "admin"); 

तो यह वहाँ बाद में अनुरोधों के लिए किया जाएगा। ऐसा तब नहीं होता है जब आप सीधे दावे जोड़ते हैं, क्योंकि आप इसे अपनी उपयोगकर्ता पहचान के "उदाहरण" में जोड़ रहे हैं जो वर्तमान अनुरोध के साथ मर जाएगा।

अपने आगे की जरूरतों के जवाब देने के लिए:

आप दावों के टिकट पर संहिताबद्ध चाहते हैं तो आपको दावों जिस तरह से आप (GrantResourceOwnerCredentials में) कर रहे हैं जोड़ने के बाद यह करने के लिए है:

var props = new AuthenticationProperties(new Dictionary<string, string> 
     { 
      { "userId", "blah,blah" }, 
      { "role", "admin" } 
     }); 

var ticket = new AuthenticationTicket(identity, props); 
context.Validated(ticket); 

इस तरह आपको इस तरह के उपयोगकर्ताओं को "जारी रखने" की आवश्यकता नहीं है

बेशक आपको बाद में अनुरोध/प्रतिक्रियाओं पर उन डेटा को पुनः प्राप्त करने के लिए OAuthAuthorizationServerProvider की टोकन एंडपॉइंट विधि को ओवरराइड करना होगा।

public override Task TokenEndpoint(OAuthTokenEndpointContext context) 
    { 
     foreach (KeyValuePair<string, string> property in context.Properties.Dictionary) 
     { 
      context.AdditionalResponseParameters.Add(property.Key, property.Value); 
     } 

     return Task.FromResult<object>(null); 
    } 
+0

इस स्थायी है? इसके अलावा इस समाधान के साथ समस्या यह है कि एक विशिष्ट प्रकार के क्लाइंट के लिए मुझे उपयोगकर्ता की आवश्यकता नहीं होती है और यदि संभव हो तो सीधे संदर्भ में भूमिका जोड़ना चाहती है – dnanon

+0

कृपया मेरे संपादन की जांच करें, उम्मीद है कि यह सहायक होगा – Vi100

+0

हाय @ डेनॉन समाधान आपके लिए काम किया? मुझे एक ही समस्या है, क्या आप कृपया मुझे अपनी GrantResourceOwnerCredentials विधि साझा कर सकते हैं? धन्यवाद! –

1

शायद यह किसी भी तरह से हल किया, लेकिन मेरे लिए यह काम करता है, तो मैं इसे इस तरह से रख:

[Authorize(Roles = "user")] 
[Route("")] 
[HttpGet] 
public async Task<IHttpActionResult> GetUserSpecificServers() { ... } 
+0

प्रश्न के संपादन के रूप में अपनी विधि की सामग्री को जोड़ा है अच्छा पकड़ आदमी। क्या आप परियोजना कंकाल को साझा करना चाहते हैं, कृपया? –

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