【问题标题】:AuthorizeAttribute not working if URL has query string?如果 URL 有查询字符串,AuthorizeAttribute 不起作用?
【发布时间】:2013-04-20 02:53:07
【问题描述】:

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

作品

不起作用

MyAction 操作的模型在其基类中有一个public string ReturnUrl { get; set; }。它还具有其他属性,但将这些属性添加到查询字符串不会影响登录重定向。好像只有 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

然后尝试访问:

【问题讨论】:

  • 惊艳。我假设没有使用异国路线。
  • @DaveA 普通路线 - 在上面添加。
  • 查看这些路由,我怀疑路由引擎很混乱...Default-Title-IDDefault-Title-ID 之间没有有效区别——它们都有第三个 ID 参数,但是路由引擎在使用 url 时不知道选择哪个。 True Default 是补充,因为 Controller 和 Action 都是可选的,但是该路由传统上是作为 1st of 2nd 的一部分实现的,以赋予路由引擎更大的灵活性。我强烈建议您尝试合并 3 条路线,然后看看您是否仍然遇到同样的问题。
  • @DaveA - 前两条路线不同的。一个指定 ID 前有文本,另一个指定没有。是的,我可能会结合其中一些路线,但为了清楚起见,我将它们保留为您所看到的。无论如何,我会尝试注释掉第一个,看看问题是否仍然存在......但我认为它会。谢谢。
  • @DaveA - 注释掉 Default-Title-IDDefault 路由后问题仍然存在。

标签: asp.net-mvc-3 authentication iis-8


【解决方案1】:

我想将此作为评论发布,但我太长了。我需要为我的一个应用程序动态重定向,并使用以下解决方案(它使用调用它的控制器而不是 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()

【讨论】:

  • 几年后我又回到了这个问题,完全忘记了我曾经提出过这个问题,再次提出了同样的问题 (stackoverflow.com/questions/29973280/…)。然后我想起了这个最初的问题,实施了你的建议,现在我很高兴,因为它正在工作。 但我仍然不知道为什么它一开始就不起作用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 2019-09-03
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2018-07-26
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多