9

में विंडोज प्रमाणीकरण और प्रपत्र प्रमाणीकरण का संकर हमारे पास एक एएसपी.नेट एमवीसी 4 इंट्रानेट एप्लिकेशन है। हम विंडोज प्रमाणीकरण का उपयोग कर रहे हैं और वह पहलू ठीक काम करता है। उपयोगकर्ता के क्रेडेंशियल्स का उपयोग किया जाता है और हम वेब ऐप से उन प्रमाणपत्रों तक पहुंच सकते हैं।एएसपी.नेट एमवीसी 4

हम वास्तव में कुछ प्रकार के हाइब्रिड मोड चाहते हैं। हम ब्राउज़र से उपयोगकर्ता के प्रमाण पत्र प्राप्त करना चाहते हैं, लेकिन हम यह भी सत्यापित करना चाहते हैं कि उपयोगकर्ता हमारे एप्लिकेशन के डेटाबेस में है। यदि उपयोगकर्ता डेटाबेस में है, तो वे अभी भी जारी रख सकते हैं। यदि वे नहीं हैं, तो हम उन्हें वैकल्पिक क्रेडेंशियल मांगने वाले पृष्ठ पर रीडायरेक्ट करना चाहते हैं। अब मैं क्या कर रहा हूं, Global.asax.cs में, मुझे Application_AuthenticateRequest विधि मिली है और मैं यह देखने के लिए जांच रहा हूं कि उपयोगकर्ता प्रमाणीकृत है या नहीं। यदि वे हैं और उनकी कुकी जानकारी इस तथ्य को प्रतिबिंबित नहीं करती है कि वे सिस्टम में लॉग इन हैं, तो मैं उन्हें लॉग इन करता हूं और उपयोगकर्ता के बारे में जानकारी के साथ कुछ कुकी सेट करता हूं। अगर वे प्रमाणीकृत नहीं हैं, तो मैं उन्हें लॉगिन पृष्ठ पर रीडायरेक्ट करता हूं। हम कंपनी नीति से जुड़े कारणों के लिए एडी भूमिकाओं का उपयोग नहीं कर सकते हैं, इसलिए हमें अतिरिक्त प्रमाणीकरण के लिए डेटाबेस का उपयोग करने की आवश्यकता है।

मुझे लगता है कि Application_AuthenticateRequest ऐसा करने का स्थान नहीं है, लेकिन शायद यह है। लेकिन हमें मूल रूप से प्रमाणीकरण के अनुरोधों को फ़िल्टर करने के लिए एक जगह की आवश्यकता है। लेकिन इसके अतिरिक्त यह कार्यान्वयन मुझे दूसरे मुद्दे पर ले जाता है:

हमारे पास हमारे ऐप में कुछ यूआरएल हैं जो अज्ञात पहुंच की अनुमति देते हैं। मैंने इनके लिए web.config पर <location> टैग जोड़े हैं। समस्या यह है कि, जब अनाम कॉल इन में किए जाते हैं, तो यह Application_AuthenticateRequest पर जाता है और उपयोगकर्ता को डीबी में लॉग करने का प्रयास करता है। अब, मैं इन यूआरएल को संभालने के लिए Application_AuthenticateRequest में कोड जोड़ सकता हूं और यह वर्तमान में मेरी योजना है, लेकिन यदि मैं लिख रहा हूं और Application_AuthenticateRequest ऐसा करने की जगह नहीं है, तो मैं इसे बाद में अब समझूंगा।

उत्तर

5

इस उद्देश्य के लिए आपको एक्शन फ़िल्टर का उपयोग करने की आवश्यकता है। तब

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    private UnitOfWork _unitOfWork = new UnitOfWork(); 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = false; 
     var username = httpContext.User.Identity.Name; 
     // Some code to find the user in the database... 
     var user = _unitOfWork.UserRepository.Find(username); 
     if(user != null) 
     { 
      isAuthorized = true; 
     } 


     return isAuthorized; 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    {    
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     if (AuthorizeCore(filterContext.HttpContext)) 
     { 
      SetCachePolicy(filterContext); 
     } 
     else 
     { 
      // If not authorized, redirect to the Login action 
      // of the Account controller... 
      filterContext.Result = new RedirectToRouteResult(
      new System.Web.Routing.RouteValueDictionary { 
       {"controller", "Account"}, {"action", "Login"} 
      } 
     );    
     } 
    } 

    protected void SetCachePolicy(AuthorizationContext filterContext) 
    { 
     // ** IMPORTANT ** 
     // Since we're performing authorization at the action level, 
     // the authorization code runs after the output caching module. 
     // In the worst case this could allow an authorized user 
     // to cause the page to be cached, then an unauthorized user would later 
     // be served the cached page. We work around this by telling proxies not to 
     // cache the sensitive page, then we hook our custom authorization code into 
     // the caching mechanism so that we have the final say on whether a page 
     // should be served from the cache. 
     HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache; 
     cachePolicy.SetProxyMaxAge(new TimeSpan(0)); 
     cachePolicy.AddValidationCallback(CacheValidationHandler, null /* data */); 
    } 

    public void CacheValidationHandler(HttpContext context, 
             object data, 
             ref HttpValidationStatus validationStatus) 
    { 
     validationStatus = OnCacheAuthorization(new HttpContextWrapper(context)); 
    } 
} 

, आप नियंत्रक स्तर या इस तरह कार्रवाई स्तर पर इस विशेषता का उपयोग कर सकते हैं:: आप इस तरह AuthorizeAttribute विस्तार कर सकते हैं

[MyAuthorize] 
public ActionResult SomeAction() 
{ 
    // Code that is supposed to be accessed by authorized users only 
} 
+0

मैं इस समाधान पसंद है, लेकिन मैं अभी भी 401 त्रुटि पर मिलता है नियंत्रक विधियों जो किसी को भी अनुमति देनी चाहिए। इस विशेष मामले में, मैं इसे सी # 'HttpWebRequest.GetResponse() 'कॉल से कॉल कर रहा हूं। 'DebugController.FlushCaches()' में [AllowAnonymous] है और 'web.config' में मेरे पास' डीबग/फ्लश कैश 'के लिए' 'टैग है जिसमें '<उपयोगकर्ताओं को =" * "/>' अनुमति है। लेकिन मेरी जब 'HttpWebRequest' यह कहता है, मैं एक 401 – Pete

+0

उपयोग इसे अपने टैग के रूप में: ' <स्थान पथ = "डीबग/FlushCaches"> <प्राधिकरण> <अनुमति देने के उपयोगकर्ताओं = "*"/> ' – ataravati

+0

http://stackoverflow.com/questions/15087755/use-anonymous-authentication-in-mvc4-on-single-controller-when-the-whole-applica – ataravati

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