c# - एएसपी.नेट वेब एपीआई कैसे सुरक्षित करें




asp.net-mvc oauth (4)

मैं एएसपी.नेट वेब एपीआई का उपयोग कर एक रीस्टफुल वेब सेवा बनाना चाहता हूं कि तीसरे पक्ष के डेवलपर मेरे एप्लिकेशन के डेटा तक पहुंचने के लिए उपयोग करेंगे।

मैंने ओएथ के बारे में बहुत कुछ पढ़ा है और यह मानक प्रतीत होता है, लेकिन यह दस्तावेज के साथ एक अच्छा नमूना ढूंढ रहा है कि यह कैसे काम करता है (और वास्तव में यह काम करता है!) अविश्वसनीय रूप से कठिन लगता है (विशेष रूप से ओएथ के लिए नौसिखिया के लिए)।

क्या कोई ऐसा नमूना है जो वास्तव में बनाता है और काम करता है और दिखाता है कि इसे कैसे कार्यान्वित किया जाए?

मैंने कई नमूने डाउनलोड किए हैं:

  • DotNetOAuth - दस्तावेज़ीकरण एक नौसिखिया परिप्रेक्ष्य से निराशाजनक है
  • Thinktecture - इसे बनाने के लिए नहीं मिल सकता है

मैंने ब्लॉगों को एक साधारण टोकन-आधारित योजना ( this तरह) का सुझाव दिया है - ऐसा लगता है कि यह पहिया का पुन: आविष्कार करने जैसा लगता है लेकिन इसका अवधारणा काफी सरल होने का लाभ है।

ऐसा लगता है कि इस तरह के कई सवाल SO पर हैं लेकिन कोई अच्छा जवाब नहीं है।

इस जगह में सब लोग क्या कर रहे हैं?


@ कुओंग ले के उत्तर में निरंतरता में, रीप्ले हमले को रोकने के लिए मेरा दृष्टिकोण होगा

// साझा निजी कुंजी (या उपयोगकर्ता का पासवर्ड) का उपयोग कर क्लाइंट पक्ष पर यूनिक्स समय एन्क्रिप्ट करें

// सर्वर पर अनुरोध हेडर के हिस्से के रूप में इसे भेजें (वेब ​​एपीआई)

// साझा निजी कुंजी (या उपयोगकर्ता का पासवर्ड) का उपयोग कर सर्वर पर यूनिक्स टाइम (WEB API) को डिक्रिप्ट करें

// क्लाइंट के यूनिक्स समय और सर्वर के यूनिक्स समय के बीच समय अंतर की जांच करें, x सेकंड से अधिक नहीं होना चाहिए

// यदि उपयोगकर्ता आईडी / हैश पासवर्ड सही हैं और डिक्रिप्ट किया गया यूनिक्सटाइम सर्वर समय के x सेकंड के भीतर है तो यह एक वैध अनुरोध है


क्या आपने DevDefined.OAuth की कोशिश की है?

मैंने इसे अपने वेबएपी को 2-लेगेड ओथ के साथ सुरक्षित करने के लिए उपयोग किया है। मैंने PHP क्लाइंट के साथ सफलतापूर्वक इसका परीक्षण किया है।

इस पुस्तकालय का उपयोग करके OAuth के लिए समर्थन जोड़ने में काफी आसान है। यहां बताया गया है कि आप एएसपी.नेट एमवीसी वेब एपीआई के लिए प्रदाता को कैसे कार्यान्वित कर सकते हैं:

1) DevDefined.OAuth का स्रोत कोड प्राप्त करें: https://github.com/bittercoder/DevDefined.OAuth - नवीनतम संस्करण OAuthContextBuilder एक्स्टेंसिबिलिटी के लिए अनुमति देता है।

2) लाइब्रेरी बनाएं और इसे अपने वेब एपीआई प्रोजेक्ट में संदर्भित करें।

3) HttpRequestMessage से संदर्भ बनाने में सहायता के लिए एक कस्टम संदर्भ निर्माता बनाएं:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Net.Http;
using System.Web;

using DevDefined.OAuth.Framework;

public class WebApiOAuthContextBuilder : OAuthContextBuilder
{
    public WebApiOAuthContextBuilder()
        : base(UriAdjuster)
    {
    }

    public IOAuthContext FromHttpRequest(HttpRequestMessage request)
    {
        var context = new OAuthContext
            {
                RawUri = this.CleanUri(request.RequestUri), 
                Cookies = this.CollectCookies(request), 
                Headers = ExtractHeaders(request), 
                RequestMethod = request.Method.ToString(), 
                QueryParameters = request.GetQueryNameValuePairs()
                    .ToNameValueCollection(), 
            };

        if (request.Content != null)
        {
            var contentResult = request.Content.ReadAsByteArrayAsync();
            context.RawContent = contentResult.Result;

            try
            {
                // the following line can result in a NullReferenceException
                var contentType = 
                    request.Content.Headers.ContentType.MediaType;
                context.RawContentType = contentType;

                if (contentType.ToLower()
                    .Contains("application/x-www-form-urlencoded"))
                {
                    var stringContentResult = request.Content
                        .ReadAsStringAsync();
                    context.FormEncodedParameters = 
                        HttpUtility.ParseQueryString(stringContentResult.Result);
                }
            }
            catch (NullReferenceException)
            {
            }
        }

        this.ParseAuthorizationHeader(context.Headers, context);

        return context;
    }

    protected static NameValueCollection ExtractHeaders(
        HttpRequestMessage request)
    {
        var result = new NameValueCollection();

        foreach (var header in request.Headers)
        {
            var values = header.Value.ToArray();
            var value = string.Empty;

            if (values.Length > 0)
            {
                value = values[0];
            }

            result.Add(header.Key, value);
        }

        return result;
    }

    protected NameValueCollection CollectCookies(
        HttpRequestMessage request)
    {
        IEnumerable<string> values;

        if (!request.Headers.TryGetValues("Set-Cookie", out values))
        {
            return new NameValueCollection();
        }

        var header = values.FirstOrDefault();

        return this.CollectCookiesFromHeaderString(header);
    }

    /// <summary>
    /// Adjust the URI to match the RFC specification (no query string!!).
    /// </summary>
    /// <param name="uri">
    /// The original URI. 
    /// </param>
    /// <returns>
    /// The adjusted URI. 
    /// </returns>
    private static Uri UriAdjuster(Uri uri)
    {
        return
            new Uri(
                string.Format(
                    "{0}://{1}{2}{3}", 
                    uri.Scheme, 
                    uri.Host, 
                    uri.IsDefaultPort ?
                        string.Empty :
                        string.Format(":{0}", uri.Port), 
                    uri.AbsolutePath));
    }
}

4) ओएथ प्रदाता बनाने के लिए इस ट्यूटोरियल का प्रयोग करें: http://code.google.com/p/devdefined-tools/wiki/OAuthProvider । अंतिम चरण में (संरक्षित संसाधन उदाहरण तक पहुंच) आप इस कोड का उपयोग अपने AuthorizationFilterAttribute विशेषता में कर सकते हैं:

public override void OnAuthorization(HttpActionContext actionContext)
{
    // the only change I made is use the custom context builder from step 3:
    OAuthContext context = 
        new WebApiOAuthContextBuilder().FromHttpRequest(actionContext.Request);

    try
    {
        provider.AccessProtectedResourceRequest(context);

        // do nothing here
    }
    catch (OAuthException authEx)
    {
        // the OAuthException's Report property is of the type "OAuthProblemReport", it's ToString()
        // implementation is overloaded to return a problem report string as per
        // the error reporting OAuth extension: http://wiki.oauth.net/ProblemReporting
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
            {
               RequestMessage = request, ReasonPhrase = authEx.Report.ToString()
            };
    }
}

मैंने अपना खुद का प्रदाता लागू किया है इसलिए मैंने उपरोक्त कोड का परीक्षण नहीं किया है (बेशक WebApiOAuthContextBuilder जिसे मैं अपने प्रदाता में उपयोग कर रहा हूं) लेकिन इसे ठीक काम करना चाहिए।


यदि आप सर्वर में अपने एपीआई को सर्वर फ़ैशन में सुरक्षित करना चाहते हैं (2 पैर वाले प्रमाणीकरण के लिए वेबसाइट पर कोई पुनर्निर्देशन नहीं)। आप OAuth2 क्लाइंट प्रमाण-पत्र अनुदान प्रोटोकॉल देख सकते हैं।

https://dev.twitter.com/docs/auth/application-only-auth

मैंने एक लाइब्रेरी विकसित की है जो आपको आसानी से इस तरह के समर्थन को आपके वेबएपीआई में जोड़ने में मदद कर सकती है। आप इसे NuGet पैकेज के रूप में स्थापित कर सकते हैं:

https://nuget.org/packages/OAuth2ClientCredentialsGrant/1.0.0.0

पुस्तकालय लक्ष्य .NET Framework 4.5।

एक बार जब आप अपनी परियोजना में पैकेज जोड़ते हैं, तो यह आपके प्रोजेक्ट की जड़ में एक रीडेमे फ़ाइल तैयार करेगा। आप इस पैकेज को कॉन्फ़िगर / उपयोग करने के तरीके को देखने के लिए उस रीडेमे फ़ाइल को देख सकते हैं।

चीयर्स!


वेब एपीआई ने सुरक्षा प्रदान करने के लिए एक विशेषता [Authorize] पेश की। इसे वैश्विक रूप से सेट किया जा सकता है (global.asx)

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new AuthorizeAttribute());
}

या प्रति नियंत्रक:

[Authorize]
public class ValuesController : ApiController{
...

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

public class DemoAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if (Authorize(actionContext))
        {
            return;
        }
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
        challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
        throw new HttpResponseException(challengeMessage);
    }

    private bool Authorize(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        try
        {
            var someCode = (from h in actionContext.Request.Headers where h.Key == "demo" select h.Value.First()).FirstOrDefault();
            return someCode == "myCode";
        }
        catch (Exception)
        {
            return false;
        }
    }
}

और आपके नियंत्रक में:

[DemoAuthorize]
public class ValuesController : ApiController{

WebApi प्राधिकरणों के लिए अन्य कस्टम लागू करने पर एक लिंक यहां दिया गया है:

http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/





asp.net-web-api