【发布时间】:2013-04-20 02:53:07
【问题描述】:
在 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 操作的模型在其基类中有一个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
然后尝试访问:
- http://your.local.host/Test/TestMe?ReturnUrl= - 您将不会被重定向到登录页面。
- http://your.local.host/Test/TestMe - 您将被重定向到登录页面。
【问题讨论】:
-
惊艳。我假设没有使用异国路线。
-
@DaveA 普通路线 - 在上面添加。
-
查看这些路由,我怀疑路由引擎很混乱...
Default-Title-ID和Default-Title-ID之间没有有效区别——它们都有第三个 ID 参数,但是路由引擎在使用 url 时不知道选择哪个。 TrueDefault是补充,因为 Controller 和 Action 都是可选的,但是该路由传统上是作为 1st of 2nd 的一部分实现的,以赋予路由引擎更大的灵活性。我强烈建议您尝试合并 3 条路线,然后看看您是否仍然遇到同样的问题。 -
@DaveA - 前两条路线是不同的。一个指定 ID 前有文本,另一个指定没有。是的,我可能会结合其中一些路线,但为了清楚起见,我将它们保留为您所看到的。无论如何,我会尝试注释掉第一个,看看问题是否仍然存在......但我认为它会。谢谢。
-
@DaveA - 注释掉
Default-Title-ID和Default路由后问题仍然存在。
标签: asp.net-mvc-3 authentication iis-8