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




asp.net-mvc authentication (2)

इस समस्या का मेरा समाधान एक कस्टम 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" />

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







asp.net-routing