asp.net-mvc-3 – 如果URL有查询字符串,AuthorizeAttribute不起作用?

在ASP.NET MVC3 Web应用程序中,整个控制器都附加了[Authorize]属性.因此,如果用户未登录或会话已过期,则会将其重定向到登录页面.这有效……有时候.下面“工作”列表中的URL正确地重定向到登录页面; “不工作”列表中的URL显示IIS 401错误屏幕 – 它们不会重定向到登录页面.

作品

> http://x.y.z/MyController/MyAction
> http://x.y.z/MyController/MyAction/123
> http://x.y.z/MyController/MyAction/123?X=Y

不起作用

> http://x.y.z/MyController/MyAction/123?ReturnUrl=
> http://x.y.z/MyController/MyAction/123?ReturnUrl=XYZ

MyAction操作的模型有一个公共字符串ReturnUrl {get;组;在它的基类中.它还具有其他属性,但将其添加到查询字符串不会影响登录重定向.它似乎只是ReturnUrl参数.

我不确定还有什么可以研究的.任何想法为什么ReturnUrl参数会导致麻烦?

路线

routes.MapRoute("Default-Title-ID", "{Controller}/{Action}/{Title}_{ID}", namespaces);
routes.MapRoute("Default-ID", "{Controller}/{Action}/{ID}", namespaces);
routes.MapRoute("Default", "{Controller}/{Action}", new { Controller = "Home", Action = "Index" }, namespaces);
routes.MapPageRoute("Reports-View", "ViewReport_{ID}", "~/Views/Reports/View.aspx");

工作示例(嗯,不工作,但说明了问题.)

在此处下载解决方案:https://docs.google.com/file/d/0B4o6vqgNLpvbeVo4bVdKZWFMcEE/edit?usp=sharing

然后尝试访问:

> http://your.local.host/Test/TestMe?ReturnUrl= – 您将不会被重定向到登录页面.
> http://your.local.host/Test/TestMe – 您将被重定向到登录页面.

最佳答案 我想将此作为评论发布,但我太长了.我需要为我的某个应用程序进行动态重定向,并使用以下解决方案(它使用调用它的控制器而不是web.config中的静态URL).在使用您的示例进行测试时,它可以解决问题.但我无法弄清楚为什么.也许它会引导你走上正确的道路或其他人可以澄清.

using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.App_Start
{
    public class LoginRequiredAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

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

然后只需更改操作即可使用新属性:

[LoginRequired]
public ActionResult TestMe()
点赞