.net एएसपी.नेट एमवीसी में गतिशील लॉगिन यूआरएल पर रीडायरेक्ट कैसे करें




asp.net-mvc authentication (3)

इस समस्या का मेरा समाधान एक कस्टम ActionResult वर्ग था:

    sealed public class RequiresLoginResult : ActionResult
    {
        override public void ExecuteResult (ControllerContext context)
        {
            var response = context.HttpContext.Response;

            var url = FormsAuthentication.LoginUrl;
            if (!string.IsNullOrWhiteSpace (url))
                url += "?returnUrl=" + HttpUtility.UrlEncode (ReturnUrl);

            response.Clear ();
            response.StatusCode = 302;
            response.RedirectLocation = url;
        }

        public RequiresLoginResult (string returnUrl = null)
        {
            ReturnUrl = returnUrl;
        }

        string ReturnUrl { get; set; }
    }

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

"{client}/{controller}/{action}/{id}"

यह ठीक काम करता है, जैसे कि foo / home / index जैसे यूआरएल।

हालांकि, [अधिकृत] विशेषता का उपयोग करते समय, मैं एक लॉगिन पृष्ठ पर रीडायरेक्ट करना चाहता हूं जो एक ही मैपिंग योजना का उपयोग करता है। तो यदि ग्राहक foo है, तो लॉगिन पृष्ठ web.config में परिभाषित निश्चित / खाता / लॉगिन रीडायरेक्ट के बजाय / foo / खाता / लॉगिन होगा।

एमवीसी एक 401 अनधिकृत स्थिति लौटने के लिए एक HttpUnauthorizedResult का उपयोग करता है, जो मुझे लगता है कि Web.config में परिभाषित पृष्ठ पर रीडायरेक्ट करने के लिए ASP.NET का कारण बनता है।

तो क्या किसी को भी एएसपी.NET लॉगिन रीडायरेक्ट व्यवहार को ओवरराइड करने के बारे में पता है? या कस्टम प्राधिकरण विशेषता बनाकर एमवीसी में रीडायरेक्ट करना बेहतर होगा?

संपादित करें - उत्तर: .NET स्रोत में कुछ खोदने के बाद, मैंने फैसला किया कि कस्टम प्रमाणीकरण विशेषता सर्वोत्तम समाधान है:

public class ClientAuthorizeAttribute: AuthorizeAttribute
{
    public override void OnAuthorization( AuthorizationContext filterContext )
    {
        base.OnAuthorization( filterContext );

        if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                {
                    { "client", filterContext.RouteData.Values[ "client" ] },
                    { "controller", "Account" },
                    { "action", "Login" },
                    { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
                });
        }
    }
}

एएसपी.नेट एमवीसी के आरटीएम संस्करण में, रद्द संपत्ति गुम है। यह कोड एएसपी.नेट एमवीसी आरटीएम के साथ काम करता है:

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Resources;

namespace ePegasus.Web.ActionFilters
{
    public class CustomAuthorize : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            if (filterContext.Result is HttpUnauthorizedResult)
            {
                filterContext.Result = new RedirectToRouteResult(
                    new System.Web.Routing.RouteValueDictionary
                        {
                                { "langCode", filterContext.RouteData.Values[ "langCode" ] },
                                { "controller", "Account" },
                                { "action", "Login" },
                                { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
                        });
            }
        }
    }
}

संपादित करें: आप web.config में डिफ़ॉल्ट रूप प्रमाणीकरण loginUrl को अक्षम करना चाहते हैं - अगर कोई भूल जाता है कि आपके पास कस्टम विशेषता है और गलती से निर्मित [अधिकृत] विशेषता का उपयोग करता है।

Web.config में मान संशोधित करें:

 <forms loginUrl="~/Account/ERROR" timeout="2880" />

फिर एक एक्शन विधि 'त्रुटि' बनाएं जो त्रुटि को लॉग करता है और उपयोगकर्ता को आपके जेनेरिक लॉगिन पेज पर रीडायरेक्ट करता है।


मुझे लगता है कि मुख्य मुद्दा यह है कि यदि आप अंतर्निहित एएसपी.नेट फॉर्म्स प्रमाणीकरण वर्ग (और कोई अच्छा कारण नहीं है) पर FormsAuthentication.RedirectToLoginPage() करने जा रहे हैं, तो दिन के अंत में कुछ फॉर्म फॉर्म FormsAuthentication.RedirectToLoginPage() को कॉल करने जा रहा है। FormsAuthentication.RedirectToLoginPage() जो एक कॉन्फ़िगर किए गए यूआरएल को देखने जा रहा है। कभी भी एक लॉगिन यूआरएल है, और यह वही है कि उन्होंने इसे कैसे डिजाइन किया।

समस्या पर मेरा स्टैब (संभवतः एक रूबे गोल्डबर्ग कार्यान्वयन) सभी ग्राहकों द्वारा साझा की गई रूट पर एक लॉगिन पृष्ठ पर रीडायरेक्ट करने के लिए, कहें / खाता / लॉगिन। यह लॉगिन पेज वास्तव में कुछ भी प्रदर्शित नहीं करेगा; यह या तो रिटर्न यूआरएल पैरामीटर या सत्र में प्राप्त कुछ मूल्य या क्लाइंट की पहचान करने वाली कुकी का निरीक्षण करता है और विशिष्ट / ग्राहक / खाता / लॉगिन पृष्ठ पर तत्काल 302 रीडायरेक्ट जारी करने के लिए इसका उपयोग करता है। यह एक अतिरिक्त रीडायरेक्ट है, लेकिन संभवतः ध्यान देने योग्य नहीं है और यह आपको निर्मित पुनर्निर्देशन तंत्र का उपयोग करने देता है।

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

उम्मीद है की वो मदद करदे!







asp.net-routing