首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET MVC中重定向到动态登录URL

如何在ASP.NET MVC中重定向到动态登录URL
EN

Stack Overflow用户
提问于 2008-12-10 17:57:05
回答 4查看 46.4K关注 0票数 96

我正在创建一个多租户网站,为客户托管页面。URL的第一段将是标识客户端的字符串,在Global.asax中使用以下URL路由方案定义:

代码语言:javascript
复制
"{client}/{controller}/{action}/{id}"

对于像/foo/Home/Index这样的URL,这种方法工作得很好。

但是,在使用Authorize属性时,我希望重定向到也使用相同映射方案的登录页面。因此,如果客户端是foo,则登录页面将是/foo/Account/Login,而不是web.config中定义的固定/Account/Login重定向。

MVC使用HttpUnauthorizedResult返回一个401UnAuthorized状态,我认为这会导致ASP.NET重定向到web.config中定义的页面。

那么,有人知道如何覆盖ASP.NET登录重定向行为吗?或者,在MVC中通过创建自定义授权属性进行重定向是否更好?

编辑-回答:在深入研究了.Net源代码之后,我决定自定义身份验证属性是最好的解决方案:

代码语言:javascript
复制
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 }
                });
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-11 06:16:23

我认为主要的问题是,如果你打算利用内置的ASP.NET FormsAuthentication类(没有什么好的理由你不应该这样做),那么最终会调用FormsAuthentication.RedirectToLoginPage(),它将查看一个配置好的URL。只有一个登录URL,这就是他们设计它的方式。

我试图解决这个问题(可能是Rube Goldberg实现)是让它重定向到所有客户端共享的根目录下的单一登录页面,比如/account/login。这个登录页面实际上不会显示任何内容;它检查ReturnUrl参数、我在会话中获得的某个值或标识客户端的cookie,并使用该cookie立即向特定的/ client /account/login页面发出302重定向。这是一个额外的重定向,但可能不会引起注意,它允许您使用内置的重定向机制。

另一种选择是在描述时创建自己的自定义属性,并避免调用FormsAuthentication类上的RedirectToLoginPage()方法的任何内容,因为您将用自己的重定向逻辑替换它。(您可以创建自己的类似类。)因为它是一个静态类,我不知道有什么机制可以让您注入自己的替代接口,并让它与现有的Authorize属性一起神奇地工作,这很糟糕,但是people have done similar things before

希望这能有所帮助!

票数 30
EN

Stack Overflow用户

发布于 2009-07-08 13:38:19

在ASP.NET MVC的RTM版本中,缺少Cancel属性。此代码适用于ASP.NET MVC RTM:

代码语言:javascript
复制
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中禁用默认的forms身份验证授权-以防有人忘记您具有自定义属性,并错误地使用内置的Authorize属性。

修改web.config中的值:

代码语言:javascript
复制
 <forms loginUrl="~/Account/ERROR" timeout="2880" />

然后创建一个操作方法' error‘,它记录一个错误,并将用户重定向到您拥有的最通用的登录页面。

票数 41
EN

Stack Overflow用户

发布于 2010-07-16 23:35:27

我对这个问题的解决方案是一个自定义的ActionResult类:

代码语言:javascript
复制
    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; }
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/356982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档