2015-01-21 63 views
0

我已经添加了一个请求来更改我的应用程序中的密码。为了确保用户被重定向到用户可以更新密码的视图,我创建了一个自定义的ExtendedAuthorize属性并覆盖了它的OnAuthorization(AuthorizationContext filterContext)。然后我用这个属性来装饰每个控制器。该属性只是检查用户是否必须更改密码,并最终重定向到相应的视图,如果是这样的话。然而,这会导致重定向循环。恐怕是因为应用程序重定向到UpdatePassword这个动作也是用这个属性装饰的,因此它会让浏览器回到OnAuthorization(AuthorizationContext filterContext)的方法ExtendedAuthorize等等,这是无限重复的。OnAuthorization导致重定向循环

我不知道如何排序。我试图把默认属性[授权],但它没有帮助。我也尝试将其更改为[AllowAnonymous],但它仍然导致重定向循环。非常感谢任何有关如何防止执行控制器属性的操作的建议。

也许有可能把两个不同的属性,如[CustomAuthorize1,CustomAuthorize2]。

回答

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; 
    } 

    .... 
} 
+0

嗨。我测试过,'OnAuthorization'确实在重定向的页面上运行。我不知道如何做条件测试。干杯! – Celdor 2015-01-26 09:47:43

+0

嗨,很高兴我可以帮助:) – 2015-01-26 18:25:39

相关问题