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


Answers

मैं पहले सबसे सरल समाधानों से शुरू करने का सुझाव दूंगा - शायद आपके परिदृश्य में सरल HTTP मूल प्रमाणीकरण + HTTPS पर्याप्त है।

यदि नहीं (उदाहरण के लिए आप https का उपयोग नहीं कर सकते हैं, या अधिक जटिल कुंजी प्रबंधन की आवश्यकता है), तो आप दूसरों द्वारा सुझाए गए एचएमएसी-आधारित समाधानों पर एक नज़र डाल सकते हैं। इस तरह के एपीआई का एक अच्छा उदाहरण अमेज़ॅन एस 3 होगा ( http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html )

मैंने एएसपी.नेट वेब एपीआई में एचएमएसी आधारित प्रमाणीकरण के बारे में एक ब्लॉग पोस्ट लिखा था। यह वेब एपीआई सेवा और वेब एपीआई क्लाइंट दोनों पर चर्चा करता है और कोड बिटबकेट पर उपलब्ध है। http://www.piotrwalat.net/hmac-authentication-in-asp-net-web-api/

वेब एपीआई में बेसिक प्रमाणीकरण के बारे में एक पोस्ट यहां दी गई है: http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-message-handlers/

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

पुनश्च। HTTPS + प्रमाणपत्रों का उपयोग करने का विकल्प भी है। http://www.piotrwalat.net/client-certificate-authentication-in-asp-net-web-api-and-windows-store-apps/

Question

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

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

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

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

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

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

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

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




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

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

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

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

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

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




वेब एपीआई ने सुरक्षा प्रदान करने के लिए एक विशेषता [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/






Links