Asp.net mvc 3 如果URL具有查询字符串,则AuthorizeAttribute不起作用?
在ASP.NET MVC3 web应用程序中,整个控制器都附加了一个Asp.net mvc 3 如果URL具有查询字符串,则AuthorizeAttribute不起作用?,asp.net-mvc-3,authentication,iis-8,Asp.net Mvc 3,Authentication,Iis 8,在ASP.NET MVC3 web应用程序中,整个控制器都附加了一个[Authorize]属性。因此,如果用户未登录或会话已过期,他们将被重定向到登录页面。这是有效的…有时。下面“工作”列表中的URL正确重定向到登录页面;“不工作”列表中的URL将显示IIS 401错误屏幕-它们不会重定向到登录页面 有效 routes.MapRoute("Default-Title-ID", "{Controller}/{Action}/{Title}_{ID}", namespaces); routes.Ma
[Authorize]
属性。因此,如果用户未登录或会话已过期,他们将被重定向到登录页面。这是有效的…有时。下面“工作”列表中的URL正确重定向到登录页面;“不工作”列表中的URL将显示IIS 401错误屏幕-它们不会重定向到登录页面
有效
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");
MyAction
操作的模型在其基类中有一个公共字符串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");
工作示例(嗯,不工作,但说明了问题。)
在此处下载解决方案:
然后尝试访问:
- -您将不会被重定向到登录页面
- -您将被重定向到登录页面
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()
惊呆了。我假设没有使用异国情调的路由。@DaveA normal routes-在上面添加了它们。查看这些路由,我怀疑路由引擎正在变得混乱。。。
默认标题ID
和默认标题ID
之间没有有效的区别——它们都有第三个ID参数,但路由引擎在使用url时不知道选择哪个。TrueDefault
是补充,因为控制器和操作都是可选的,但该路线传统上是作为第1个或第2个路线的一部分实施的,以使路线引擎具有更大的灵活性。我强烈建议您尝试合并这3条路线,然后看看您是否仍然存在相同的问题。@DaveA-前两条路线是不同的。一个指定ID前面有文本,另一个指定没有文本。是的,我可能会结合这些路线中的一些,但为了清晰起见,我将它们保留在您看到的地方。不管怎样,我会试着对第一个问题进行评论,看看问题是否依然存在……但我认为会的。谢谢。@DaveA-在注释掉默认标题ID
和默认路径后,问题仍然存在。几年后,我又回到这个问题上来,完全忘记了我曾经创建过这个问题,再次创建了相同的问题()。然后我想起了最初的问题,实施了你的建议,现在我很高兴,因为它起作用了。但我还是不知道为什么它一开始就不起作用。谢谢