OnAuthorization导致重定向循环

时间:2015-01-21 11:11:22

标签: c# asp.net-mvc redirect authorization

我在应用程序中添加了更改密码的请求。为确保将用户重定向到用户可以更新密码的视图,我创建了自定义ExtendedAuthorize属性并覆盖了其OnAuthorization(AuthorizationContext filterContext)。然后我用这个属性装饰每个控制器。该属性只是检查用户是否必须更改密码,并最终重定向到相应的视图(如果是这种情况)。然而,这会导致重定向循环。我担心这是因为应用程序重定向到UpdatePassword操作,该操作也使用此属性进行修饰,因此它使浏览器返回到OnAuthorization(AuthorizationContext filterContext)ExtendedAuthorize方法,这是无限重复。

我不知道如何排序。我试图把默认属性[授权]但它没有帮助。我也尝试将其更改为[AllowAnonymous],但它仍然导致Redirect Loop。关于如何阻止动作执行控制器属性的任何建议都非常感激。

也许可以放置两个不同的属性,例如[CustomAuthorize1,CustomAuthorize2]。

1 个答案:

答案 0 :(得分:1)

解决此问题的一个好方法是检查ExtendedAuthorize属性,OnAuthorization是否在您希望用户重定向到的页面上运行。

我猜您的ExtendedAuthorize类似于以下内容:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class ExtendedAuthorizeAttribute : AuthorizeAttribute
{
    private readonly string _redirectActionName;
    private readonly string _redirectControllerName;

    SimpleAuthorizeAttribute(string redirectActionName, string redirectControllerName)
    {
        _redirectActionName = redirectActionName;
        _redirectControllerName = redirectControllerName;
    }

    public string RedirectActionName 
    { 
        get
        {
            return _redirectActionName;
        } 
    }

    public string RedirectControllerName 
    { 
        get
        {
            return _redirectControllerName;
        } 
    }
}

在这种情况下,您只需要检查OnAuthorize是否在您希望用户重定向到的页面上运行:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    base.OnAuthorization(filterContext);

    if(filterContext.ActionDescriptor.ActionName == RedirectActionName && 
       filterContext.ActionDescriptor.ControllerDescriptor.ControllerName == RedirectControllerName)
    {
        return;
    }

    ....
}