2012-01-12 8 views
4

私はアクションとコントローラクラスの両方でカスタムAuthorizeAttributeでフォーム認証を使用するASP.NET MVCサイトを持っています。認証フォームloginUrlを動的に設定していますか?

私は私のweb.configファイルでこれを持っている:サイトは「ノーマル」モードの場合

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogOn" timeout="2880" /> 
</authentication> 

が、これは正常に動作します。ログインする必要があるユーザーは、このページにリダイレクトされます。

しかし、テストモードに切り替えると、すべてのContollersがロックされ、AccountControllerもロックされます。

テストモードでロックされていないコントローラーアクションを指すようにするときにloginUrlを変更する必要があります。これはテストシナリオに対して特別なものです。

loginUrlを変更するにはどうすればよいですか、AuthorizeAttributeからリダイレクトすることはできますか?

答えて

5

私たちがやることのようなので、HandleUnauthorizedRequest機能のためにリダイレクトするカスタマイズされた承認属性をオーバーライドします:

public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute 
    { 

     public string LoginController { get; set; } 
     public string LoginAction { get; set; } 


     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (string.IsNullOrEmpty(LoginController)&&string.IsNullOrEmpty(LoginAction)) 
       base.HandleUnauthorizedRequest(filterContext); 
        filterContext.Result =new RedirectToRouteResult(
              new RouteValueDictionary(new 
                     { 
                      controller = LoginController, 
                      action = LoginAction, 
                      returnUrl = HttpContext.Current.Request.Url 
                     })); 
     } 
    } 

私たちが行くように、コントローラとアクションを割り当てることにより、任意のAUTHORIZE属性のログインルートを指定することができますこの方法ために。それ以外の場合は、標準のauthorize属性のように動作します。

これは、テストモードまたはライブモードであることに応じてリダイレクトするように変更できます。

+0

これはうまく見える、私は明日それを試してみる。 – Banshee

関連する問題