c# - किसी भी यूजर इंटरफेस के बिना वेब एपीआई में टोकन आधारित प्रमाणीकरण




.net authentication (2)

मैं ASP.Net वेब API में REST API विकसित कर रहा हूं। मेरा एपीआई केवल गैर-ब्राउज़र आधारित ग्राहकों के माध्यम से सुलभ होगा। मुझे अपने एपीआई के लिए सुरक्षा लागू करने की आवश्यकता है इसलिए मैंने टोकन आधारित प्रमाणीकरण के साथ जाने का फैसला किया। मुझे टोकन आधारित प्रमाणीकरण की उचित समझ है और मैंने कुछ ट्यूटोरियल पढ़े हैं, लेकिन वे सभी लॉगिन के लिए कुछ यूजर इंटरफेस रखते हैं। मुझे लॉगिन के लिए किसी UI की आवश्यकता नहीं है क्योंकि क्लाइंट द्वारा HTTP POST के माध्यम से लॉगिन विवरण पास किया जाएगा जो हमारे डेटाबेस से अधिकृत होगा। मैं अपने एपीआई में टोकन आधारित प्रमाणीकरण कैसे लागू कर सकता हूं? कृपया ध्यान दें- मेरा एपीआई उच्च आवृत्ति में एक्सेस किया जाएगा इसलिए मुझे प्रदर्शन का भी ध्यान रखना होगा। कृपया मुझे बताएं कि क्या मैं इसे किसी भी बेहतर तरीके से समझा सकता हूं।


ASP.Net वेब API में प्राधिकरण सर्वर बिल्ड-इन पहले से है। जब आप वेब API टेम्पलेट के साथ एक नया ASP.Net वेब अनुप्रयोग बनाते हैं, तो आप इसे स्टार्टअप के अंदर देख सकते हैं।

OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
    // In production mode set AllowInsecureHttp = false
    AllowInsecureHttp = true
};

आपको बस इतना करना है कि क्वेरी स्ट्रिंग के अंदर URL एनकोडेड यूज़रनेम और पासवर्ड पोस्ट करना है।

/Token/userName=johndoe%40example.com&password=1234&grant_type=password

यदि आप अधिक विस्तार से जानना चाहते हैं, तो आप उपयोगकर्ता पंजीकरण और लॉगिन - कोणीय मोर्चा बैक टू वेब एपीआई विथ देबोराह कुरता देख सकते हैं


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

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

टोकन पाने के लिए यहां कुछ क्लाइंट साइड C # कोड दिए गए हैं:

    //using System;
    //using System.Collections.Generic;
    //using System.Net;
    //using System.Net.Http;
    //string token = GetToken("https://localhost:<port>/", userName, password);

    static string GetToken(string url, string userName, string password) {
        var pairs = new List<KeyValuePair<string, string>>
                    {
                        new KeyValuePair<string, string>( "grant_type", "password" ), 
                        new KeyValuePair<string, string>( "username", userName ), 
                        new KeyValuePair<string, string> ( "Password", password )
                    };
        var content = new FormUrlEncodedContent(pairs);
        ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
        using (var client = new HttpClient()) {
            var response = client.PostAsync(url + "Token", content).Result;
            return response.Content.ReadAsStringAsync().Result;
        }
    }

टोकन का उपयोग करने के लिए इसे अनुरोध के शीर्ष लेख में जोड़ें:

    //using System;
    //using System.Collections.Generic;
    //using System.Net;
    //using System.Net.Http;
    //var result = CallApi("https://localhost:<port>/something", token);

    static string CallApi(string url, string token) {
        ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
        using (var client = new HttpClient()) {
            if (!string.IsNullOrWhiteSpace(token)) {
                var t = JsonConvert.DeserializeObject<Token>(token);

                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + t.access_token);
            }
            var response = client.GetAsync(url).Result;
            return response.Content.ReadAsStringAsync().Result;
        }
    }

टोकन कहाँ है:

//using Newtonsoft.Json;

class Token
{
    public string access_token { get; set; }
    public string token_type { get; set; }
    public int expires_in { get; set; }
    public string userName { get; set; }
    [JsonProperty(".issued")]
    public string issued { get; set; }
    [JsonProperty(".expires")]
    public string expires { get; set; }
}

अब सर्वर पक्ष के लिए:

Startup.Auth.cs में

        var oAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider("self"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            // https
            AllowInsecureHttp = false
        };
        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(oAuthOptions);

और ApplicationOAuthProvider.cs में वह कोड होता है जो वास्तव में अनुदान देता है या पहुंच से इनकार करता है:

//using Microsoft.AspNet.Identity.Owin;
//using Microsoft.Owin.Security;
//using Microsoft.Owin.Security.OAuth;
//using System;
//using System.Collections.Generic;
//using System.Security.Claims;
//using System.Threading.Tasks;

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
    private readonly string _publicClientId;

    public ApplicationOAuthProvider(string publicClientId)
    {
        if (publicClientId == null)
            throw new ArgumentNullException("publicClientId");

        _publicClientId = publicClientId;
    }

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

        var 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 user.GenerateUserIdentityAsync(userManager);
        var propertyDictionary = new Dictionary<string, string> { { "userName", user.UserName } };
        var properties = new AuthenticationProperties(propertyDictionary);

        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        // Token is validated.
        context.Validated(ticket);
    }

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

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        // Resource owner password credentials does not provide a client ID.
        if (context.ClientId == null)
            context.Validated();

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

    public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
    {
        if (context.ClientId == _publicClientId)
        {
            var expectedRootUri = new Uri(context.Request.Uri, "/");

            if (expectedRootUri.AbsoluteUri == context.RedirectUri)
                context.Validated();
        }
        return Task.FromResult<object>(null);
    }

}

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

सुनिश्चित करें कि आप केवल एसएसएल का उपयोग करते हैं। इसे लागू करने के लिए आवश्यकताएँअभियोजन को लागू करें।

आप अपने Web Api को सुरक्षित करने के लिए Authorize / AllowAnonymous विशेषताओं का उपयोग कर सकते हैं। इसके अतिरिक्त आप अपने Web Api को अधिक सुरक्षित बनाने के लिए फ़िल्टर (जैसे NeedHttpsAttribute) जोड़ सकते हैं। आशा है कि ये आपकी मदद करेगा।





http-token-authentication