asp.net - AngularJS, WebAPI 2 और Oauth 2 का उपयोग करते समय मैं अपने क्लाइंट ऐप पर प्राधिकरण जानकारी वापस कैसे भेज सकता हूं?




asp.net-web-api claims-based-identity (3)

2 तरीके हैं जो मुझे लगता है कि आप अपनी समस्या से संपर्क कर सकते हैं।

  1. एक हैश द्वारा टोकन में "भूमिका" जानकारी शामिल करें या एक साधारण स्ट्रिंग संलग्न करें क्योंकि आप टोकन उत्पन्न कर रहे हैं, तो आप इसे कोणीय पर समझ सकते हैं।

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

आईएमओ, # 1 आपको अपने उपयोगकर्ता डेटा को स्टोर और उपयोग करने के तरीके के बारे में अधिक लचीलापन देगा क्योंकि आप माइक्रोसॉफ्ट के आइडेंटिटी यूज़र का पालन कर रहे हैं, हालांकि यह कभी-कभी जादू दिखता है और यह सीमा पोस्ट करना पड़ता है और आपको समझने के लिए समय बिताना पड़ता है कि यह कैसे काम करता है दृश्य और इसे अपनी परियोजना के लिए काम करते हैं।

आपके द्वारा बनाए गए वेबएपीआई प्रोजेक्ट के दौरान चुने गए "व्यक्तिगत उपयोगकर्ता खाते" के बारे में और जानने के लिए, आप http://www.asp.net/visual-studio/overview/2013/creating-web-projects-in-visual-studio#indauth जा सकते हैं http://www.asp.net/visual-studio/overview/2013/creating-web-projects-in-visual-studio#indauth

मेरे पास एक AngularJS क्लाइंट एप्लिकेशन है जो नवीनतम Identity 2 का उपयोग कर वेबएपीआई WebAPI 2 एप्लिकेशन के विरुद्ध प्रमाणित करने के लिए javascript (कॉफ़ीस्क्रिप्ट या टाइपस्क्रिप्ट नहीं) Oauth2 का उपयोग करता है। मेरे आवेदन में सभी सॉफ्टवेयर बहुत ताजा है और this example पर आधारित है। मेरे क्लाइंट ब्राउज़र लक्ष्य IE9 और ऊपर हैं।

ध्यान दें कि मैंने ऊपर दिए गए उदाहरण से कुछ मामूली परिवर्तन किए हैं, जिसमें मैं ट्रांसफॉर्म का उपयोग कर सर्वर पर भेजे गए सभी डेटा urlencode नहीं करता हूं। इसके बजाय मैं केवल नीचे प्रमाणीकृत विधि में urlencode:

user.authenticate = function (userName, password, rememberMe, successCallback, errorCallback) {
    var config = {
        method: 'POST',
        url: '/Token',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        data: 'grant_type=password&username=' + encodeURIComponent(userName) + '&password=' + encodeURIComponent(password),
    };

मैं वीएस2013 अपडेट 2 और सर्वर पर विकास कर रहा हूं, मैं सी #, नवीनतम इकाई फ्रेमवर्क और एसक्यूएल सर्वर 2012 का उपयोग करता हूं।

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

$http.defaults.headers.common.Authorization = 'Bearer ' + user.data.bearerToken;

यह अब तक बहुत अच्छी तरह से काम करता है लेकिन जैसा कि यह खड़ा है कि एप्लिकेशन उन उपयोगकर्ताओं के बीच अंतर बताने में असमर्थ है जिनके पास अलग-अलग भूमिकाएं हैं।

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

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

इस प्रश्न का उत्तर देते समय कृपया ध्यान दें कि मैं ऐसे उत्तर की तलाश नहीं कर रहा हूं जो समुदाय को बता सकता है कि सर्वर पर भूमिकाएं कैसे स्थापित करें या एक उत्तर जो बताता है कि सर्वर पर भूमिका जांच प्रदान करना कितना महत्वपूर्ण है। मुझे लगता है कि लगभग हर किसी को इसके बारे में पता है। मैं वास्तव में क्या सोचता हूं इसका उपयोग नमूना कोड और स्पष्टीकरण के साथ कुछ बहुत ही विस्तृत तकनीकी सुझाव है। उत्तर केंद्रित रखने के लिए यह संभवतः सभी के लिए मदद की जाएगी यदि उत्तर जो इस आवश्यकता को पूरा नहीं करते हैं, उन्हें सुझाए गए उत्तरों के रूप में पोस्ट नहीं किया जाता है।

पहले ही, आपका बहुत धन्यवाद।


आपके प्रश्न का संक्षिप्त उत्तर ApplicationOAuthProvider.CreateProperties विधि है। यह आपके लिए डिफ़ॉल्ट रूप से बनाया गया है और WebApi2 / प्रदाता / ApplicationOAuthProvider.cs के अंतर्गत पाया जाता है, डिफ़ॉल्ट रूप से यह केवल उपयोगकर्ता नाम भेजता है

//WepApi2/Providers/ApplicationOAuthProvider.cs
public static AuthenticationProperties CreateProperties(string userName)
{
    IDictionary<string, string> data = new Dictionary<string, string>
    {
        { "userName", userName }
    };
    return new AuthenticationProperties(data);
}

मैं निम्नलिखित अद्यतन कर दूंगा (यदि मुझे बाद में अधिक उपयोगकर्ता डेटा भेजने की आवश्यकता है):

public static AuthenticationProperties CreateProperties(string userName, ClaimsIdentity oAuthIdentity)
{ 
  IDictionary<string, string> data = new Dictionary<string, string>
  {
      { "userName", userName},
      { "roles",string.Join(",",oAuthIdentity.Claims.Where(c=> c.Type == ClaimTypes.Role).Select(c => c.Value).ToArray())}

  };
  return new AuthenticationProperties(data);
}

यदि आपने WebApi प्रोजेक्ट में बड़े बदलाव नहीं किए हैं, तो ApplicationOAuthProvider.CreateProperties को केवल दो स्थानों में संदर्भित किया गया है, केवल oAuthIdentity के साथ user.UserName को पास करने के लिए कॉलिंग कोड अपडेट करें। उपयोगकर्ता user.UserName और आपको उपयोगकर्ता भूमिकाओं को एक्सेस के साथ भेजा जाएगा टोकन प्रतिक्रिया:

{
 "access_token": "ZpxAZyYuvCaWgShUz0c_XDLFqpbC0-DIeXl_tuFbr11G-5hzBzSUxFNwNPahsasBD9t6mDDJGHcuEqdvtBT4kDNQXFcjWYvFP7U2Y0EvLS3yejdSvUrh2v1N7Ntz80WKe5G_wy2t11eT0l48dgdyak8lYcl3Nx8D0cgwlQm-pePIanYZatdPFP9q5jzhD-_k9SF-ARTHgf0ePnbvhLBi1MCYQjvfgPKlbBHt0M5qjwGAeFg1IhSVj0gb4g9QTXoiPhRmxGBmjOpGgzxXixavmrpM7cCBFLoR3DCGnIJo6pwT-6VArxlB8-ZyyOZqh_6gGtptd0lIu8iJRUIGwO9HFNkROdoE9T4buwLnhPpWpy9geBjPVwsB1K3xnbch26YbklhxIHVybBxeIVXd17QTw_LjlQ5TJdqpAYfiZ5B9Nx2AFYYYe3--aemh4y1XOIvN",
 "token_type": "bearer",
 "expires_in": 1209599,
 "userName": "MK",
 "roles": "Admin,Public",
 ".issued": "Fri, 23 May 2014 17:36:54 GMT",
 ".expires": "Fri, 06 Jun 2014 17:36:54 GMT"
}

अब आपके पास भूमिकाएं उपलब्ध हैं, आप उपयोगकर्ता भूमिकाओं के अनुसार क्रियाओं को दिखाने / छिपाने के लिए कोणीय सशर्त निर्देशों का उपयोग कर सकते हैं।

अगर आपको और स्पष्टीकरण की आवश्यकता है, तो कृपया मुझे बताएं।

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

Authorize विशेषता के साथ ClaimsIdentity आपके नियंत्रक विधियां मान्य हैं, क्योंकि HttpContext.Current.User.Identity वास्तव में ClaimsIdentity । लेकिन आवेदन के अंदर हार्ड कोड सुरक्षा तर्क के रूप में, मैं ClaimsAuthorizationManager का उपयोग करना पसंद करता ClaimsAuthorizationManager

public ActionResult Secure()
{
  if(!ClaimsPrincipalPermission.CheckAccess("resource", "action"))
    return new HttpUnauthorizedResult();

  ViewBag.Message = "You are allowed to perform action on resource.";
  return View();
}

RoleManager का उपयोग कर भूमिकाएं निर्माण:

RoleManager roleManger = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>());
roleManager.Create(new IdentityRole() { Name = "Admin" });

UserManager का उपयोग कर रोल असाइनमेंट:

userManager.AddToRole(user.Id, "Admin");

यहां एक और जवाब है:

ApplicationOAuthProvider.cs में

  public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

            ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);


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

बस एक कस्टम हेडर जोड़ें!

 context.OwinContext.Response.Headers.Add("Roles", userManager.GetRoles(user.Id).ToArray());




claims-based-identity