2011-12-20 10 views
8

MVCで[Authorize]という属性を使用する方法を読んだことがあります。これをアクションまたはセキュリティ保護するコントローラクラスに配置するだけです。MVC3でauthorize属性を使用する方法

私の質問は:Authorize属性は、ユーザーがログに記録されているかどうかをどのように知っていますか?ユーザーが承認されているかどうかをAuthorizeに知らせるために、セッションオブジェクトを提供する必要がありますか?

答えて

15

この属性の動作は、HttpContext.User.Identity.IsAuthenticatedです。

FormsAuthenticationのようなものを使用している場合は、ユーザーがマシン上に有効なFormsAuthentication Cookie(FormsAuthentication.SetAuthCookieを使用して追加できる)を持っている場合はtrueに設定されます。

あなたがAuthorizeの内部動作に興味があるなら、これは発行され、Microsoftのソースコードからである。ここでは

protected virtual bool AuthorizeCore(HttpContextBase httpContext) { 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 

     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) { 
      return false; 
     } 

     if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) { 
      return false; 
     } 

     if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) { 
      return false; 
     } 

     return true; 
    } 

some more info on FormsAuthenticationです。

+0

ありがとうございます。素晴らしいリソース! – Jose3d

2

Authorize属性クラスは、デフォルトでhttpcontextを引数として取ります。呼び出されると。次に、HttpContext.User.Identity.IsAuthenticatedブール値をチェックし、それに応じて動作します。これは、フォーム認証を使用する場合にのみ機能します。独自のログインロジック(セッションオブジェクトなど)を使用している場合、Authorize Attributeからクラスを派生させて呼び出すことができます。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true,  AllowMultiple = true)] 
public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     clsSession sess = httpContext.Session["Current"] as clsSession; 
     if (sess.IsLogin) return true; 
     return false; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult { ViewName = "Unauthorized" }; 
    } 
} 

次に、あなたはこのように、このクラスを使用することができます:

[MyAuthorize] 
public ActionResult Index() 
{ 
    return View(); 
} 

これは動作します。すべてのコントローラーアクションで[認証]の代わりに[MyAuthorize]を使用できます。 falseを返すと、ビュー(この場合は「Unauthorized」)が返されます。ビュー名は何でもかまいません。ビュー/共有フォルダに配置できます。

関連する問題