asp.net वेब एपीआई के वाहक टोकन से उपयोगकर्ता भूमिकाएं लौटें




authentication asp.net-web-api2 (2)

मैं एक वेब एपीआई 2 प्रोजेक्ट विकसित कर रहा हूं प्रमाणीकरण के लिए मैं वाहक टोकन का उपयोग कर रहा हूं I सफल प्रमाणीकरण पर एपीआई एक JSON ऑब्जेक्ट देता है।

{"access_token":"Vn2kwVz...",
   "token_type":"bearer",
   "expires_in":1209599,
   "userName":"username",
   ".issued":"Sat, 07 Jun 2014 10:43:05 GMT",
   ".expires":"Sat, 21 Jun 2014 10:43:05 GMT"}

अब मैं उपयोगकर्ता भूमिकाओं को इस जेएसएएन ऑब्जेक्ट में भी वापस करना चाहता हूं। JSON प्रतिक्रिया से उपयोगकर्ता की भूमिकाएं प्राप्त करने के लिए मुझे क्या बदलाव करने की आवश्यकता है?


खोज करने के बाद बहुत कुछ मैंने पाया कि मैं कुछ कस्टम गुण बना सकता हूं और उन्हें प्रमाणन टिकट के साथ सेट कर सकते हैं। इस तरीके से आप प्रतिक्रिया को अनुकूलित कर सकते हैं ताकि कॉलर एंड पर आवश्यक कस्टम मान हो सकें।

टोकन के साथ उपयोगकर्ता भूमिकाएं भेजने के लिए यहां कोड है। जो मेरी आवश्यकता थी कोई आवश्यक डेटा भेजने के लिए कोड को संशोधित कर सकता है

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        using (UserManager<ApplicationUser> userManager = _userManagerFactory())
        {
            ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

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

            ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
                context.Options.AuthenticationType);

            ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
                CookieAuthenticationDefaults.AuthenticationType);
            List<Claim> roles = oAuthIdentity.Claims.Where(c => c.Type == ClaimTypes.Role).ToList();
            AuthenticationProperties properties = CreateProperties(user.UserName, Newtonsoft.Json.JsonConvert.SerializeObject(roles.Select(x=>x.Value)));

            AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
            context.Validated(ticket);
            context.Request.Context.Authentication.SignIn(cookiesIdentity);
        }
    }


 public static AuthenticationProperties CreateProperties(string userName, string Roles)
    {
        IDictionary<string, string> data = new Dictionary<string, string>
        {
            { "userName", userName },
            {"roles",Roles}
        };
        return new AuthenticationProperties(data);
    }

यह मुझे बाहर रखा जाएगा के रूप में डाल दिया

`{"access_token":"Vn2kwVz...",
 "token_type":"bearer",
 "expires_in":1209599,
 "userName":"username",
 ".issued":"Sat, 07 Jun 2014 10:43:05 GMT",
 ".expires":"Sat, 21 Jun 2014 10:43:05 GMT"
 "roles"=["Role1","Role2"] }`

आशा है कि यह जानकारी किसी एक के लिए सहायक होगी :)


उपरोक्त परिवर्तनों के नीचे भूमिका के रूप में प्रामाणिकता प्रदाता में एक अतिरिक्त विधि के साथ अपेक्षित भूमिका निभाने के लिए अच्छा है: (इस पद्धति को जोड़ें और भूमिकाओं के साथ रॉक करें ...)

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);
        }




bearer-token