Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如果URL具有查询字符串,则AuthorizeAttribute不起作用?_Asp.net Mvc 3_Authentication_Iis 8 - Fatal编程技术网

Asp.net mvc 3 如果URL具有查询字符串,则AuthorizeAttribute不起作用?

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

在ASP.NET MVC3 web应用程序中,整个控制器都附加了一个
[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");
工作示例(嗯,不工作,但说明了问题。)

在此处下载解决方案:

然后尝试访问:

  • -您将不会被重定向到登录页面
  • -您将被重定向到登录页面

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

惊呆了。我假设没有使用异国情调的路由。@DaveA normal routes-在上面添加了它们。查看这些路由,我怀疑路由引擎正在变得混乱。。。
默认标题ID
默认标题ID
之间没有有效的区别——它们都有第三个ID参数,但路由引擎在使用url时不知道选择哪个。True
Default
是补充,因为控制器和操作都是可选的,但该路线传统上是作为第1个或第2个路线的一部分实施的,以使路线引擎具有更大的灵活性。我强烈建议您尝试合并这3条路线,然后看看您是否仍然存在相同的问题。@DaveA-前两条路线是不同的。一个指定ID前面有文本,另一个指定没有文本。是的,我可能会结合这些路线中的一些,但为了清晰起见,我将它们保留在您看到的地方。不管怎样,我会试着对第一个问题进行评论,看看问题是否依然存在……但我认为会的。谢谢。@DaveA-在注释掉
默认标题ID
默认路径后,问题仍然存在。几年后,我又回到这个问题上来,完全忘记了我曾经创建过这个问题,再次创建了相同的问题()。然后我想起了最初的问题,实施了你的建议,现在我很高兴,因为它起作用了。但我还是不知道为什么它一开始就不起作用。谢谢