ASP.NET वेब एपीआई प्रमाणीकरण


122

मैं ASP.NET वेब एपीआई का उपयोग करते हुए एक उपयोगकर्ता को क्लाइंट एप्लिकेशन से प्रमाणित करने के लिए देख रहा हूं । मैंने साइट पर सभी वीडियो देखे हैं और इस मंच पोस्ट को भी पढ़ा है ।

लाना [Authorize]विशेषता सही ढंग से एक रिटर्न 401 Unauthorizedस्थिति। हालांकि, मुझे यह जानना होगा कि उपयोगकर्ता को एपीआई में लॉग इन करने की अनुमति कैसे दी जाए।

मैं एक एंड्रॉइड एप्लिकेशन से एपीआई के लिए उपयोगकर्ता क्रेडेंशियल्स प्रदान करना चाहता हूं, उपयोगकर्ता को लॉग इन करें, और उसके बाद सभी पूर्व एपीआई कॉल पूर्व-प्रमाणित हैं।


हाय मुजतबा। क्या आप इसे लागू करने में सक्षम थे?
विवेक चंद्रप्रकाश

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

जवाबों:


137

किसी उपयोगकर्ता को API में लॉग इन करने की अनुमति दें

आपको अनुरोध के साथ एक मान्य प्रपत्र प्रमाणीकरण कुकी भेजने की आवश्यकता है। इस कुकी को आमतौर पर सर्वर द्वारा भेजा जाता है जब विधि ( MSDN देखें LogOn) को कॉल करके प्रमाणित ( कार्रवाई) किया जाता है ।[FormsAuthentication.SetAuthCookie

इसलिए क्लाइंट को 2 चरण करने होंगे:

  1. LogOnउपयोगकर्ता नाम और पासवर्ड भेजकर एक कार्रवाई के लिए HTTP अनुरोध भेजें । इस क्रिया में यह FormsAuthentication.SetAuthCookieविधि विधि को बुलाएगा (यदि क्रेडेंशियल मान्य हैं) तो बदले में प्रतिक्रिया में प्रपत्र प्रमाणीकरण कुकी सेट करेगा।
  2. [Authorize]पहले अनुरोध में पुनर्प्राप्त किए गए प्रपत्र प्रमाणीकरण कुकी के साथ भेजकर एक संरक्षित कार्रवाई के लिए एक HTTP अनुरोध भेजें ।

एक उदाहरण लेते हैं। मान लीजिए कि आपके वेब एप्लिकेशन में 2 एपीआई नियंत्रक परिभाषित हैं:

प्रमाणीकरण से निपटने के लिए पहला जिम्मेदार:

public class AccountController : ApiController
{
    public bool Post(LogOnModel model)
    {
        if (model.Username == "john" && model.Password == "secret")
        {
            FormsAuthentication.SetAuthCookie(model.Username, false);
            return true;
        }

        return false;
    }
}

और दूसरा संरक्षित कार्य जिसमें केवल अधिकृत उपयोगकर्ता देख सकते हैं:

[Authorize]
public class UsersController : ApiController
{
    public string Get()
    {
        return "This is a top secret material that only authorized users can see";
    }
}

अब हम इस API का उपभोग करने वाले क्लाइंट एप्लिकेशन को लिख सकते हैं। यहां एक तुच्छ कंसोल एप्लिकेशन उदाहरण दिया गया है (सुनिश्चित करें कि आपने Microsoft.AspNet.WebApi.Clientऔर Microsoft.Net.HttpNuGet पैकेज स्थापित किए हैं):

using System;
using System.Net.Http;
using System.Threading;

class Program
{
    static void Main()
    {
        using (var httpClient = new HttpClient())
        {
            var response = httpClient.PostAsJsonAsync(
                "http://localhost:26845/api/account", 
                new { username = "john", password = "secret" }, 
                CancellationToken.None
            ).Result;
            response.EnsureSuccessStatusCode();

            bool success = response.Content.ReadAsAsync<bool>().Result;
            if (success)
            {
                var secret = httpClient.GetStringAsync("http://localhost:26845/api/users");
                Console.WriteLine(secret.Result);
            }
            else
            {
                Console.WriteLine("Sorry you provided wrong credentials");
            }
        }
    }
}

और यहाँ 2 HTTP अनुरोध तार पर कैसे दिखते हैं:

प्रमाणीकरण अनुरोध:

POST /api/account HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost:26845
Content-Length: 39
Connection: Keep-Alive

{"username":"john","password":"secret"}

प्रमाणीकरण प्रतिक्रिया:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: .ASPXAUTH=REMOVED FOR BREVITY; path=/; HttpOnly
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 4
Connection: Close

true

संरक्षित डेटा के लिए अनुरोध:

GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY

संरक्षित डेटा के लिए प्रतिक्रिया:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 66
Connection: Close

"This is a top secret material that only authorized users can see"

क्या यह Android एप्लिकेशन के लिए एक सत्र बनाए रखने जा रहा है?
मुजतबा हसन

बिंदु मिल गया लेकिन क्या आप दूसरे बिंदु के लिए एक नमूना कोड पोस्ट कर सकते हैं। आपके उत्तर के लिए धन्यवाद।
मुजतबा हसन

2
Android HTTP क्लाइंट लिखना एक अन्य प्रश्न के लिए एक विषय है। यह ASP.NET MVC और ASP.NET MVC वेब एपीआई से संबंधित नहीं है जो कि आपका प्रश्न था। मैं आपको जावा और एंड्रॉइड के साथ एक नया थ्रेड स्पष्ट रूप से टैग करने की शुरुआत करने की सलाह दूंगा जिसमें आप HTTP क्लाइंट लिखने के बारे में पूछते हैं जो कुकीज़ का उपयोग करके अनुरोध भेजता है।
डारिन दिमित्रोव

दरअसल एमवीसी 4 वेबएपी के साहित्य में उन्होंने लिखा है कि वेबएपीआई थर्ड पार्टी क्लाइंट्स के लिए विशेष रूप से मोबाइल क्लाइंट (और इसके बारे में पता है) के लिए लक्षित है। कहते हैं कि हमारे पास एक डेस्कटॉप एप्लिकेशन क्लाइंट है, क्या आप कृपया एक सरल कोड स्निपेट पोस्ट कर सकते हैं। धन्यवाद
मुजतबा हसन

2
HTTP बेसिक प्रमाणीकरण का उपयोग करने के बारे में भी यह प्रश्न (और उत्तर) देखें: stackoverflow.com/questions/10987455/…
जिम हर्ट

12

मैं उदाहरण के तौर पर android लेता हूँ।

public abstract class HttpHelper {

private final static String TAG = "HttpHelper";
private final static String API_URL = "http://your.url/api/";

private static CookieStore sCookieStore;

public static String invokePost(String action, List<NameValuePair> params) {
    try {
        String url = API_URL + action + "/";
        Log.d(TAG, "url is" + url);
        HttpPost httpPost = new HttpPost(url);
        if (params != null && params.size() > 0) {
            HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
            httpPost.setEntity(entity);
        }
        return invoke(httpPost);
    } catch (Exception e) {
        Log.e(TAG, e.toString());
    }

    return null;
}

public static String invokePost(String action) {
    return invokePost(action, null);
}

public static String invokeGet(String action, List<NameValuePair> params) {
    try {
        StringBuilder sb = new StringBuilder(API_URL);
        sb.append(action);
        if (params != null) {
            for (NameValuePair param : params) {
                sb.append("?");
                sb.append(param.getName());
                sb.append("=");
                sb.append(param.getValue());
            }
        }
        Log.d(TAG, "url is" + sb.toString());
        HttpGet httpGet = new HttpGet(sb.toString());
        return invoke(httpGet);
    } catch (Exception e) {
        Log.e(TAG, e.toString());
    }

    return null;
}

public static String invokeGet(String action) {
    return invokeGet(action, null);
}

private static String invoke(HttpUriRequest request)
        throws ClientProtocolException, IOException {
    String result = null;
    DefaultHttpClient httpClient = new DefaultHttpClient();

    // restore cookie
    if (sCookieStore != null) {
        httpClient.setCookieStore(sCookieStore);
    }

    HttpResponse response = httpClient.execute(request);

    StringBuilder builder = new StringBuilder();
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            response.getEntity().getContent()));
    for (String s = reader.readLine(); s != null; s = reader.readLine()) {
        builder.append(s);
    }
    result = builder.toString();
    Log.d(TAG, "result is ( " + result + " )");

    // store cookie
    sCookieStore = ((AbstractHttpClient) httpClient).getCookieStore();
    return result;
}

कृपया ध्यान दें ention i.localhost का उपयोग नहीं किया जा सकता है। एंड्रॉइड डिवाइस होस्ट के रूप में लोकलहोस्ट दिखते हैं। ii। यदि आईआईएस में वेब एपीआई को तैनात किया जाता है, तो फॉर्म प्रमाणीकरण को खोला जाना चाहिए।


0

इस कोड और एक्सेस डेटाबेस का उपयोग करें

[HttpPost]
[Route("login")]
public IHttpActionResult Login(LoginRequest request)
{
       CheckModelState();
       ApiResponse<LoginApiResponse> response = new ApiResponse<LoginApiResponse>();
       LoginResponse user;
       var count = 0;
       RoleName roleName = new RoleName();
       using (var authManager = InspectorBusinessFacade.GetAuthManagerInstance())
       {
           user = authManager.Authenticate(request); 
       } reponse(ok) 
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.