2009-11-30 19 views
53

MVCを使用するようにサイトをアップグレードしており、認証を設定する最適な方法を探しています。認証されたユーザーの役割の保存/割り当て

この時点で、私はActive Directoryのログインをしています:ユーザー名とパスワードを検証してから、認証Cookieを設定してください。

ログイン時にユーザのロール情報を保存して、コントローラがユーザがサイトをナビゲートする際にそれらのロールを参照できるようにするにはどうすればよいですか?

[Authorize(Roles = "admin")] 

Active Directoryから役割のリストを取得するのに問題はありません。私はちょうどコントローラがそれらを見ることができるようにそれらを置くべきか分からない。

答えて

6

ユーザーを認証すると、新しいGenericPrincipalインスタンスが生成されます。コンストラクタは、ユーザのロールである文字列の配列をとります。今度は、HttpContext.Current.Userをgenericプリンシパルと同じに設定し、auth cookieを書き込みます。それはそれを行う必要があります。

1

authorization store role managerまたはfind (e.g. on Codeplex)またはwrite Active Directoryでグループ情報を取得する別のロールプロバイダをドロップできませんか。

これにより、ユーザーを認証し、役割を取得し、その情報をコンストラクタにリダイレクトする手間が省け、すべてが自動的にフレームワークの一部として実行されます。

121

ロールがHttpContextのIPrincipalに追加されます。 GenericPrincipalを作成し、コンストラクタ内のロールのリストを解析し、HttpContext.Userとして設定できます。 GenericPrincipalはその後User.IsInRole("role")を通じてアクセスできるようになりますか[Authorize(Roles="role")]属性

(C#で)これを行う1つの方法は、あなたの認証チケットを作成する際に、ユーザデータパラメータのカンマ区切りの文字列としてあなたの役割を追加することです

string roles = "Admin,Member"; 
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
    1, 
    userId, //user id 
    DateTime.Now, 
    DateTime.Now.AddMinutes(20), // expiry 
    false, //do not remember 
    roles, 
    "/"); 
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, 
            FormsAuthentication.Encrypt(authTicket)); 
Response.Cookies.Add(cookie); 

は、その後、あなたのGlobal.asax.cs

protected void Application_AuthenticateRequest(Object sender, EventArgs e) { 
    HttpCookie authCookie = 
       Context.Request.Cookies[FormsAuthentication.FormsCookieName]; 
    if (authCookie != null) { 
     FormsAuthenticationTicket authTicket = 
            FormsAuthentication.Decrypt(authCookie.Value); 
     string[] roles = authTicket.UserData.Split(new Char[] { ',' }); 
     GenericPrincipal userPrincipal = 
         new GenericPrincipal(new GenericIdentity(authTicket.Name),roles); 
     Context.User = userPrincipal; 
    } 
    } 
+1

クラウスがあなたに前もって答えなかったなら、私はあなたに正しい答えを与えたでしょう。これは、私も同様にやっている正確な方法です。詳細な答えをありがとう。申し訳ありません、少し遅かったです。 –

+0

クッキーを無効にしているユーザーにはこれはうまくいかないと思いますか? – Omu

+1

@Omuクッキーが存在しない場合、Application_AuthenticationRequest()メソッドを変更してURL内の認証チケットを検索するだけで、Cookieレス認証をサポートできます。重要な部分は、役割が暗号化された認証チケットに格納されていることです。 –

3

私はちょうどカスタムロールプロバイダを作成するために傾斜させることだろうからGenericPrincipalを認証チケットの役割のリストにアクセスして作成します。ここでは例:

「私はASPでそれをテストしてみた:あなたはデビッド・グレンの答えを利用したときにヤロスワフWaliszkoのアドバイスをする必要がある場合、MVC 4以上を使用してあなたのそれらのために

http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider-with-repository-injection/

4

。 NET MVC 4と私は代わりにApplication_PostAuthenticateRequestを使用することをお勧めします。それ以外の場合は、一般的なプリンシパルがオーバーライドされます。 - Jaroslaw Waliszko Sep 7 at 16:18

上記のように、これを動作させるには、Application_AuthenticateRequestメソッド名をApplication_PostAuthenticateRequestに置き換えるだけです。私の魅力のように働いた!私がジャロスロウとデイヴィッドをアップウォークすることが許されたなら、私はそうするでしょう。

+3

私はスタックオーバーフローの評判が新しく登録されたメンバーであるため、私はコメントできないので、存在しません。これがあれば、それはショックと私を驚かせるだろう:) *キューショックと驚き* – Gareth