在 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");
Run Code Online (Sandbox Code Playgroud)
工作实例(当然,不是工作,而是说明了这个问题。)
在此处下载解决方案:https : //docs.google.com/file/d/0B4o6vqgNLpvbeVo4bVdKZWFMcEE/edit?usp=sharing
然后尝试访问:
我有自定义授权属性:
using System;
using System.Web.Mvc;
using System.Web.Routing;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Login", action = "Login" }));
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
Run Code Online (Sandbox Code Playgroud)
...我用来装饰某些控制器:
[MyAuthorizeAttribute(Roles = "Superman, Batman, Spiderman")]
public class SuperHeroController : Controller
{
// ....
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释如何修改授权代码,以便如果授权失败,登录URL包括ReturnUrl
(当前控制器/方法的URL)?
这基本上是试图模仿Web表单ReturnUrl逻辑,但是以一种聪明的方式,我不必手动使用字符串作为URL.
我有一个使用 Owin Cookie 身份验证的 MVC 应用程序。我启用了 SlidingExpiration 并正常工作。但是,当用户的登录过期并将它们发送回 LoginPath 时,ReturnUrl 给我带来了一些问题:
我尝试创建自己的 AuthorizeAttribute(下面的代码)并将其应用于我的一个控制器中的某些方法,但似乎在会话过期时它永远不会被命中。
public class CheckLoginExpirationFilter : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
{
string returnUrl = null;
if (filterContext.HttpContext.Request.HttpMethod.Equals("GET", StringComparison.CurrentCultureIgnoreCase))
returnUrl = filterContext.HttpContext.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.SafeUnescaped);
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary()
{
{ "client", filterContext.RouteData.Values[ "client" ] },
{ "controller", "Security" },
{ "action", "Login" },
{ "ReturnUrl", returnUrl }
}); …
Run Code Online (Sandbox Code Playgroud)