ASP.NET वेब एपीआई में उपयोगकर्ता प्रमाणीकरण


150

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

मैं चकित हूं कि कैसे मैं Googling के कई घंटों के बाद Authorizeअपने ApiControllerतरीकों पर विशेषता का उपयोग करने के लिए नीचे लॉगिन स्क्रीन से एक उपयोगकर्ता को प्रमाणित करने का एक स्पष्ट उदाहरण नहीं पा सका हूं ।

यह एक सवाल नहीं है, लेकिन यह कैसे करना है, इसके उदाहरण के लिए एक अनुरोध। मैंने निम्नलिखित पृष्ठों को देखा है:

हालांकि ये समझाते हैं कि अनधिकृत अनुरोधों को कैसे संभालना है, ये स्पष्ट रूप से कुछ ऐसा प्रदर्शित नहीं करते हैं LoginControllerजैसे कि उपयोगकर्ता क्रेडेंशियल्स के लिए पूछना और उन्हें मान्य करना।

कोई भी एक अच्छा सरल उदाहरण लिखने या मुझे सही दिशा में इंगित करने के लिए तैयार है, कृपया?

धन्यवाद।


1
मैंने इस पर उसी तरह के प्रश्न का उत्तर दिया है: stackoverflow.com/questions/11775594/…
cuongle

Asp.net के साथ वेब एपि के लिए, आप सिर्फ कुकी और फॉर्माउटेंटिकेशन मॉड्यूल का उपयोग कर सकते हैं जैसा कि आप एक mvc ऐप (यदि आप चाहते हैं) के साथ कर सकते हैं। तो अपने वेब एप कोड में आप प्रिंसिपल को यह देखने के लिए देख सकते हैं कि उपयोगकर्ता लॉग-इन कर रहा है, उदाहरण के लिए (पहले जैसा ही)।
इलियट


मैं दृढ़ता से कई लोगों को asp.net/web-api/overview/security/… लेख पढ़ने की सलाह देता हूं ।
यंगजई

जवाबों:


176

मैं चकित हूं कि कैसे मैं Googling के कई घंटों के बाद अपने ApiController तरीकों पर अधिकृत विशेषता का उपयोग करने के लिए नीचे लॉगिन स्क्रीन से किसी उपयोगकर्ता को प्रमाणित करने का एक स्पष्ट उदाहरण नहीं पा सका हूं।

ऐसा इसलिए है क्योंकि आप इन दो अवधारणाओं के बारे में भ्रमित हो रहे हैं:

  • प्रमाणीकरण वह तंत्र है जिसके द्वारा सिस्टम सुरक्षित रूप से अपने उपयोगकर्ताओं की पहचान कर सकता है। प्रमाणीकरण प्रणाली सवालों के जवाब प्रदान करती है:

    • उपयोगकर्ता कौन है?
    • क्या उपयोगकर्ता वास्तव में वह है जो वह खुद का प्रतिनिधित्व करता है?
  • प्राधिकरण वह तंत्र है जिसके द्वारा एक प्रणाली निर्धारित करती है कि सिस्टम द्वारा नियंत्रित संसाधनों के लिए किसी विशेष प्रमाणित उपयोगकर्ता की पहुँच किस स्तर तक होनी चाहिए। उदाहरण के लिए, एक डेटाबेस प्रबंधन प्रणाली को कुछ विशिष्ट व्यक्तियों को डेटाबेस से जानकारी प्राप्त करने की क्षमता प्रदान करने के लिए डिज़ाइन किया जा सकता है, लेकिन डेटाबेस में संग्रहीत डेटा को बदलने की क्षमता नहीं है, जबकि अन्य व्यक्तियों को डेटा बदलने की क्षमता प्रदान करता है। प्राधिकरण प्रणाली सवालों के जवाब प्रदान करती है:

    • क्या उपयोगकर्ता X संसाधन R का उपयोग करने के लिए अधिकृत है?
    • क्या उपयोगकर्ता X ऑपरेशन P करने के लिए अधिकृत है?
    • क्या उपयोगकर्ता X संसाधन R पर ऑपरेशन P करने के लिए अधिकृत है?

AuthorizeMVC में विशेषता उदाहरण के लिए पहुँच नियम लागू करने के लिए प्रयोग किया जाता है:

 [System.Web.Http.Authorize(Roles = "Admin, Super User")]
 public ActionResult AdministratorsOnly()
 {
     return View();
 }

ऊपर नियम केवल अनुमति देगा में उन व्यवस्थापक और सुपर उपयोगकर्ता भूमिकाओं विधि का उपयोग करने की

ये नियम locationतत्व का उपयोग करके web.config फ़ाइल में भी सेट किए जा सकते हैं । उदाहरण:

  <location path="Home/AdministratorsOnly">
    <system.web>
      <authorization>
        <allow roles="Administrators"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>

हालाँकि, उन प्राधिकरण नियमों को निष्पादित करने से पहले, आपको वर्तमान वेब साइट पर प्रमाणित होना होगा ।

हालांकि ये समझाते हैं कि अनधिकृत अनुरोधों को कैसे संभालना है, ये स्पष्ट रूप से एक लॉगिनकंट्रोलर या ऐसा कुछ प्रदर्शित नहीं करते हैं जो उपयोगकर्ता क्रेडेंशियल्स के लिए पूछें और उन्हें मान्य करें।

यहाँ से, हम समस्या को दो में विभाजित कर सकते हैं:

  • एक ही वेब एप्लिकेशन के भीतर वेब एपीआई सेवाओं का उपभोग करते समय उपयोगकर्ताओं को प्रमाणित करें

    यह सबसे सरल तरीका होगा, क्योंकि आप ASP.Net में प्रमाणीकरण पर भरोसा करेंगे

    यह एक सरल उदाहरण है:

    web.config

    <authentication mode="Forms">
      <forms
        protection="All"
        slidingExpiration="true"
        loginUrl="account/login"
        cookieless="UseCookies"
        enableCrossAppRedirects="false"
        name="cookieName"
      />
    </authentication>

    उपयोगकर्ताओं को खाते / लॉगिन मार्ग पर पुनर्निर्देशित किया जाएगा , वहां आप उपयोगकर्ता क्रेडेंशियल्स के लिए पूछने के लिए कस्टम नियंत्रण प्रस्तुत करेंगे और फिर आप उपयोग करके प्रमाणीकरण कुकी सेट करेंगे:

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
  • क्रॉस - प्लेटफ़ॉर्म प्रमाणीकरण

    यह मामला तब होगा जब आप केवल वेब एप्लिकेशन के भीतर वेब एपीआई सेवाओं को उजागर कर रहे हैं इसलिए, आपके पास सेवाओं का उपभोग करने वाला एक और ग्राहक होगा, ग्राहक एक और वेब एप्लिकेशन या कोई भी .net एप्लिकेशन (जीत फॉर्म, डब्ल्यूपीएफ, कंसोल, विंडोज सेवा) हो सकता है। आदि)

    उदाहरण के लिए मान लें कि आप एक ही नेटवर्क डोमेन (इंट्रानेट के भीतर) पर एक अन्य वेब एप्लिकेशन से वेब एपीआई सेवा का उपभोग कर रहे हैं, इस मामले में आप ASP.Net द्वारा प्रदान किए गए विंडोज प्रमाणीकरण पर भरोसा कर सकते हैं।

    <authentication mode="Windows" />

    यदि आपकी सेवाओं को इंटरनेट पर उजागर किया जाता है, तो आपको प्रत्येक वेब एपीआई सेवा के लिए प्रमाणित टोकन को पास करना होगा।

    अधिक जानकारी के लिए, निम्नलिखित लेखों के लिए एक लूट लें:


3
वाह! इसी को मैं उत्तर कहता हूं। तो, निष्कर्ष निकालना। मैं निम्नलिखित कार्य करने की योजना बना रहा हूं: 1. लॉगिन विधि के साथ एक खाता नियंत्रक बनाएं जो HTTPS पर उपयोगकर्ता नाम और पासवर्ड प्राप्त करता है और लॉगिन परिणाम और टोकन लौटाता है। 2. क्लाइंट टोकन को संग्रहीत करता है और इसे एक हेडर (अब कोई एचटीटीपीएस नहीं) के रूप में भेजता है जिसे वेब सर्वर द्वारा मान्य किया जाता है। क्या यह एक अच्छा तरीका है? फिर मेरा अंतिम संदेह यह है कि टोकन छेड़छाड़ और समाप्ति को कैसे नियंत्रित किया जाए। क्या यह संभव है?
लुइस एगुइलर

6
@ जूपॉल मुझे लगता है कि मैं कई वेब एपीआई डेवलपर्स के लिए बोलता हूं, मैं फॉर्म ऑथेंटिकेशन का उपयोग नहीं कर सकता हूं क्योंकि मेरे पास एक वेबसाइट नहीं है और क्लाइंट एक ब्राउज़र का उपयोग नहीं कर रहे हैं, और न ही मैं एकीकृत प्रमाणीकरण का उपयोग कर सकता हूं क्योंकि उपयोगकर्ता किसी भी डिवाइस पर दुनिया में कहीं भी हो सकते हैं () इसलिए वेब एपीआई), तो मैं क्या उपयोग करूं?
मार्मन

21
मुझे समझ में नहीं आ रहा है कि यह उत्तर इतने सारे उत्थान को क्यों मिलता है। यह ASP.NET वेब API के बारे में नहीं बल्कि ASP.NET MVC के बारे में है।
बैस्टियन वंदामे

3
मैं B413 की टिप्पणी को दोहराना चाहता हूं और कहना चाहता हूं कि यह प्रश्न विशेष रूप से वेब एपीआई के लिए पूछता है
जुलिएन

6
क्या यह एसओ पर सबसे ज्यादा वोट देने वाला 'गलत' जवाब है? जवाब वास्तव में वेब एपीआई के बारे में बात नहीं करता है जो एक पीवीसी वेब एप्लिकेशन से बहुत अलग है! @ B413 की तरह मैं पूरी तरह से हैरान हूँ!
stt106

15

यदि आप एक उपयोगकर्ता नाम और पासवर्ड के खिलाफ प्रमाणित करना चाहते हैं और एक प्राधिकरण कुकी के बिना , MVC4 अधिकृत विशेषता बॉक्स से बाहर काम नहीं करेगा। हालाँकि, आप मूल प्रमाणीकरण शीर्षलेखों को स्वीकार करने के लिए अपने नियंत्रक में निम्न सहायक विधि जोड़ सकते हैं। इसे अपने कंट्रोलर के तरीकों की शुरुआत से कहें।

void EnsureAuthenticated(string role)
{
    string[] parts = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(Request.Headers.Authorization.Parameter)).Split(':');
    if (parts.Length != 2 || !Membership.ValidateUser(parts[0], parts[1]))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No account with that username and password"));
    if (role != null && !Roles.IsUserInRole(parts[0], role))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "An administrator account is required"));
}

क्लाइंट की ओर से, यह सहायक HttpClientजगह में प्रमाणीकरण हेडर के साथ बनाता है:

static HttpClient CreateBasicAuthenticationHttpClient(string userName, string password)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userName + ':' + password)));
    return client;
}

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

9

मैं एमवीसी 5 / वेब एपीआई परियोजना पर काम कर रहा हूं और वेब आपी विधियों के लिए प्राधिकरण प्राप्त करने में सक्षम होने की आवश्यकता है। जब मेरा अनुक्रमणिका दृश्य पहली बार लोड होता है तो मैं 'टोकन' वेब एपीआई पद्धति के लिए एक कॉल करता हूं, जो मुझे लगता है कि स्वचालित रूप से बनाया गया है।

टोकन प्राप्त करने के लिए क्लाइंट साइड कोड (CoffeeScript) है:

getAuthenticationToken = (username, password) ->
    dataToSend = "username=" + username + "&password=" + password
    dataToSend += "&grant_type=password"
    $.post("/token", dataToSend).success saveAccessToken

यदि निम्नलिखित को सफल कहा जाता है, जो स्थानीय स्तर पर प्रमाणीकरण टोकन को बचाता है:

saveAccessToken = (response) ->
    window.authenticationToken = response.access_token

फिर अगर मुझे एक वेब एपीआई विधि के लिए एक अजाक्स कॉल करने की आवश्यकता है जिसमें [प्राधिकृत] टैग है तो मैं केवल अपने अजाक्स कॉल के लिए निम्नलिखित हेडर जोड़ता हूं:

{ "Authorization": "Bearer " + window.authenticationToken }

कहाँ से response.access_tokenआता है? क्या आप इसे c # कोड से सेट कर रहे हैं ..?
शाश्वत

'प्रतिक्रिया' ऑब्जेक्ट 'टोकन' विधि द्वारा लौटाया जाता है।
प्रोनिमरॉड

मैंने भूमिकाओं में नहीं देखा है। यह दृष्टिकोण आपको केवल एक एक्सेस-टोकन देता है जिससे आप [अधिकृत] टैग के साथ सजाया गया WebApi विधियों को कॉल कर सकते हैं। वास्तव में, जब आप उन विधियों में से किसी को भी कॉल करते हैं जो आप भूमिकाओं के लिए जांच सकते हैं। stackoverflow.com/questions/19689570/mvc-5-check-user-role मदद कर सकता है।
प्रोफैनमरॉड

और इस समाधान में आप वास्तव में अपने उपयोगकर्ता को कहां प्रमाणित करते हैं?
क्रेग ब्रेट

/ टोकन समापन बिंदु किसी भी नए वेब API प्रोजेक्ट के लिए स्वचालित रूप से बनाया गया है। इसके पीछे का कोड वह है जहां उपयोगकर्ता प्रमाणित होता है। यदि आपने किसी मौजूदा MVC प्रोजेक्ट में वेब API नियंत्रक जोड़ा है तो यह थोड़ा अधिक जटिल है।
प्रोनिमरोड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.