2012-11-30 61 views
2

使用Fluent Security,我使用DenyAnonymousAccess,DenyAuthenticationAccess和RequireRole配置了網站訪問。從RequiredRole和其他策略中捕獲異常並使用Fluent Security重定向

SecurityConfigurator.Configure(configuration => 
{ 
    configuration.ResolveServicesUsing(new FluentSecurityServiceLocator()); 
    configuration.GetAuthenticationStatusFrom(CurrentUser.IsAuthenticated); 

    configuration.GetRolesFrom(CurrentUser.Roles); 

    configuration.For<HomeController>().DenyAnonymousAccess(); 
    configuration.For<ReportsController>().RequireRole(UserRole.Administrator); 
    configuration.For<AccountController>().DenyAuthenticatedAccess(); 

    configuration.For<AccountController>(x => x.ChangePassword()).DenyAnonymousAccess(); 
}); 

我已經爲DenyAnonymousAccess處理了PolictyViolationException並將其重定向到了登錄頁面。

public ActionResult Handle(PolicyViolationException exception) 
{ 
    return new RedirectToRouteResult(
     new RouteValueDictionary(new { action = "Login", controller = "Account" }) 
     ); 
} 

但我不確定是否從RequireRole捕獲異常是相同的過程?如果RequireRole被違反,我需要重定向。

此外,當用戶未登錄並單擊附加到角色的鏈接時,我得到未處理的denyanonymous訪問異常版本。我在配置和實現中做錯了什麼?

回答

4

您必須正確定義違規處理程序類的名稱。這取決於需要處理的違規行爲。 如果您正在處理DenyAnonymousAccessPolicy的違規行爲,那麼您的違規處理程序類必須具有以策略名稱開頭的名稱,並且必須實現IPolicyViolationHandler。這條規則必須遵循有關的所有政策違反 這樣的:

public class DenyAnonymousAccessPolicyViolationHandler : IPolicyViolationHandler 
{ 
    public ActionResult Handle(PolicyViolationException exception) 
    { 

     //Log the violation, send mail etc. etc. 
     var rvd = new RouteValueDictionary(new 
     { 
      area = "", 
      controller = "Account", 
      action = "LogOn", 
      statusDescription = exception.Message 
     }); 
     return new RedirectToRouteResult(rvd); 

    } 
} 

對於RequireRolePolicy,處理器應該是這樣的:

public class RequireRolePolicyViolationHandler : IPolicyViolationHandler 
{ 
    public ActionResult Handle(PolicyViolationException exception) 
    { 

     //Log the violation, send mail etc. etc. 
     var rvd = new RouteValueDictionary(new 
     { 
      area = "", 
      controller = "Home", 
      action = "Home", 
      statusDescription = exception.Message 
     }); 
     return new RedirectToRouteResult(rvd); 

    } 
} 

檢查此鏈接的流暢安全策略違規處理程序進一步瞭解。

https://github.com/kristofferahl/FluentSecurity/wiki/Policy-violation-handlers-2.0

希望它有幫助!

+0

好吧,我明白了。因此定義的每個角色都轉到RequireRolePolicyViolationHandler。謝謝! – asunrey