10

एएसपी.नेट में फॉर्म्स प्रमाणीकरण मॉड्यूल किसी भी HTTP 401 को रोकता है, और लॉगिन पृष्ठ पर HTTP 302 पुनर्निर्देशन देता है। यह AJAX के लिए दर्द है, क्योंकि आप जेसन के लिए पूछते हैं और एचटीएमएल में लॉगिन पेज प्राप्त करते हैं, लेकिन स्टेटस कोड HTTP 200 है।फॉर्म को रोकें प्रमाणीकरण मॉड्यूल एएसपी.NET वेब एपीआई प्रतिक्रियाओं को रोकना

एएसपी.नेट वेब एपीआई में इस अवरोध से बचने का तरीका क्या है?

ASP.NET MVC4 में यह स्पष्ट रूप से कनेक्शन बंद कर दिया इस अवरोध को रोकने के लिए बहुत आसान है:

public class MyMvcAuthFilter:AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest() && !filterContext.IsChildAction) 
     { 
      filterContext.Result = new HttpStatusCodeResult(401); 
      filterContext.HttpContext.Response.StatusCode = 401; 
      filterContext.HttpContext.Response.SuppressContent = true; 
      filterContext.HttpContext.Response.End(); 
     } 
     else 
      base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

लेकिन ASP.NET वेब एपीआई में मैं कनेक्शन स्पष्ट रूप से समाप्त नहीं हो सकता है, इसलिए जब भी मैं इस का उपयोग कोड FormsAuthenticationModule प्रतिक्रिया को बीच में रोक और प्रवेश पृष्ठ पर एक पुनर्निर्देशन भेजता है:

public class MyWebApiAuth: AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     if(actionContext.Request.Headers.Any(h=>h.Key.Equals("X-Requested-With",StringComparison.OrdinalIgnoreCase))) 
     { 
      var xhr = actionContext.Request.Headers.Single(h => h.Key.Equals("X-Requested-With", StringComparison.OrdinalIgnoreCase)).Value.First(); 

      if (xhr.Equals("XMLHttpRequest", StringComparison.OrdinalIgnoreCase)) 
      { 
       // this does not work either 
       //throw new HttpResponseException(HttpStatusCode.Unauthorized); 

       actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized); 
       return; 
      } 
     } 

     base.HandleUnauthorizedRequest(actionContext); 
    } 
} 

ASP.NET वेब एपीआई में इस व्यवहार से बचने का तरीका क्या है? मैं एक नज़र देख रहा हूं, और मुझे ऐसा करने का कोई तरीका नहीं मिला।

सम्मान।

पीएस: मुझे विश्वास नहीं है कि यह 2012 है और यह समस्या अभी भी चालू है।

+1

किसी और के लिए देख रहे हैं, इसे आजमाएं: http://blog.craigtp.co.uk/post/OWIN-Hosted-Web-API-in-an-MVC-Project – Sentinel

+0

@Sentinel द्वारा पोस्ट किया गया लिंक मेरी समस्या को हल करता है .... धन्यवाद! –

उत्तर

4

एमवीसी 4 आरसी के लिए रिलीज नोट्स का अर्थ यह है कि बीटा के बाद से इसका समाधान किया गया है - जिसका आप उपयोग कर रहे हैं?

http://www.asp.net/whitepapers/mvc4-release-notes अनधिकृत ASP.NET वेब एपीआई वापसी ने संभाला 401 Unauthroized अनुरोध: अनधिकृत ASP.NET वेब एपीआई द्वारा नियंत्रित अब बजाय एक मानक 401 अनधिकृत प्रतिसाद वापसी एक लॉगिन फार्म के लिए उपयोगकर्ता एजेंट पुन: निर्देशित होने अनुरोध ताकि प्रतिक्रिया एक अजाक्स ग्राहक द्वारा संभाला जा सकता है।

MVC के लिए स्रोत कोड में देख रहे हैं वहाँ एक कार्यक्षमता SuppressFormsAuthRedirectModule.cs

http://aspnetwebstack.codeplex.com/SourceControl/network/forks/BradWilson/AspNetWebStack/changeset/changes/ae1164a2e339#src%2fSystem.Web.Http.WebHost%2fHttpControllerHandler.cs के माध्यम से जोड़े जाने के लिए प्रकट होता है।

<appSettings> 
    <Add Key = "webapi:EnableSuppressRedirect" value = "false" /> 
</appSettings> 
:

internal static bool GetEnabled(NameValueCollection appSettings) 
    { 
      // anything but "false" will return true, which is the default behavior 

तो यह एक पक्ष बिंदु की तरह आप AppSettings http://d.hatena.ne.jp/shiba-yan/20120430/1335787815 का उपयोग कर इस नए मॉड्यूल निष्क्रिय कर सकते हैं ऐसा लगता है जैसे यह यह डिफ़ॉल्ट रूप से सक्षम किया गया है और आर सी किसी भी कारनामों के बिना आपकी समस्या का समाधान करना चाहिए ... लग रहा है

संपादित करें (उदाहरण और स्पष्टीकरण)

मैं अब GitHub पर इस दृष्टिकोण के लिए एक उदाहरण बनाया है। नए पुनर्निर्देशन दमन के लिए आवश्यक है कि आप दो सही "अधिकृत" विशेषता का उपयोग करें; एमवीसी वेब [System.Web.Mvc.Authorize] और वेब एपीआई [System.Web.Http.Authorize] नियंत्रकों में और/या वैश्विक फ़िल्टर Link में।

हालांकि यह उदाहरण दृष्टिकोण की सीमा को आकर्षित करता है। ऐसा प्रतीत होता है कि web.config में "प्रमाणीकरण" नोड हमेशा एमवीसी मार्गों पर प्राथमिकता लेते हैं उदा। इस तरह config अपने नियमों को पार कर जाएगी और अभी भी अनुप्रेषित लॉगइन करने के लिए:

<system.web> 
    <authentication mode="Forms"> 
    </authentication> 
    <authorization> 
     <deny users="?"/> //will deny anonymous users to all routes including WebApi 
    </authorization> 
</system.web> 

दुर्भाग्य से यह स्थान तत्व का उपयोग प्रकट नहीं होता है कुछ यूआरएल मार्गों के लिए खोलने काम करने के लिए और WebAPI कॉल को रोका और पर पुनः निर्देशित किया जाना जारी रहेगा लॉग इन करें।

समाधान

MVC अनुप्रयोगों मैं बस Web.Config से config को दूर करने और वैश्विक फ़िल्टर के साथ चिपके हुए और कोड में गुण का सुझाव कर रहा हूँ के लिए।

यदि आपको वेब में प्राधिकरण नोड्स का उपयोग करना चाहिए। एमवीसी के लिए कॉनफिग या हाइब्रिड एएसपी.नेट और वेबएपी एप्लिकेशन के बाद @PilotBob - नीचे दी गई टिप्पणियों में - पाया गया है कि उप फ़ोल्डर्स और एकाधिक वेब। कॉनफिग का उपयोग किया जा सकता है अपने केक लो और इसे खाओ।

+0

मैं बीटा का उपयोग कर रहा हूं क्योंकि पिछले हफ्ते मैंने नवीनतम संस्करण प्राप्त करने का प्रयास किया था, और निर्भरता रीसोलवर अपेक्षित काम नहीं कर रहा था, इसलिए निन्टेक्ट एमवीसी काम नहीं कर सका, मैंने औसत समय के लिए प्रस्तावित कुछ कामकाज की कोशिश की, लेकिन काम नहीं किया । अपको इस बारे में कुछ पता है? बहुत - बहुत धन्यवाद। – vtortola

+1

@NullOrEmpty ओह ठीक है। मैं निनजेक्ट के साथ आरसी पर हूं (ऑटोफैक से चले गए क्योंकि मुझे आरसी के शुरुआती दिनों में समस्याएं थीं)। यह लिंक मेरे जैसा दृष्टिकोण दिखाता है और ठीक काम करना चाहिए http://www.strathweb.com/2012/05/using-ninject-with-the-latest-asp-net-web-api-source/ –

+0

ग्रेट धन्यवाद! मैं इसे बाद में कोशिश करूंगा। – vtortola

2

मैं निम्नलिखित संपत्ति की स्थापना द्वारा web.config में इनकार गुमनाम सेटिंग के आसपास प्राप्त करने में सक्षम था:

Request.RequestContext.HttpContext.SkipAuthorization = true

मैं global.asax.cs में Application_BeginRequest विधि में अनुरोध ऑब्जेक्ट के विरुद्ध कुछ चेक के बाद ऐसा करता हूं, जैसे कि RawURL प्रॉपर्टी और अन्य शीर्षलेख जानकारी, यह सुनिश्चित करने के लिए कि अनुरोध उस क्षेत्र तक पहुंच रहा है जिसे मैं अज्ञात पहुंच की अनुमति देना चाहता हूं । एपीआई एक्शन कहलाए जाने के बाद भी मैं प्रमाणीकरण/प्रमाणीकरण करता हूं।

5

मामले में किसी को अधिकृत करें विशेषता का उपयोग ASP.NET MVC अनुप्रयोग में एक ही समस्या हल करने में रुचि है:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
public class Authorize2Attribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAuthenticated) 
     { 
      filterContext.Result = new HttpStatusCodeResult((int) HttpStatusCode.Forbidden); 
     } 
     else 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true; 
      } 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

इस तरह ब्राउज़र ठीक से निषिद्ध और अनधिकृत अनुरोधों के बीच अलग ..

संबंधित मुद्दे