web-dev-qa-db-ja.com

認証済みユーザーの役割を保存/割り当て

MVCを使用するようにサイトをアップグレードし、認証をセットアップするための最良の方法を探しています。

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

ユーザーがサイト内を移動するときにコントローラーがこれらのロールを表示できるように、ログイン時にユーザーのロール情報を保存するにはどうすればよいですか?

[Authorize(Roles = "admin")]

Active Directoryからロールのリストを取得しても問題ありません。コントローラーがそれらを見ることができるように、どこに置いたらよいかわかりません。

54
Billy Logan

ユーザーを認証すると、新しいGenericPrincipalインスタンスが生成されます。コンストラクターは、ユーザーのロールである文字列の配列を受け取ります。次に、HttpContext.Current.Userを汎用プリンシパルと等しく設定し、認証Cookieを書き込みます。

ロールは、HttpContextの IPrincipal に追加されます。 GenericPrincipal を作成し、コンストラクターでロールのリストを解析して、HttpContext.Userとして設定できます。 GenericPrincipalは、User.IsInRole("role")または[Authorize(Roles="role")]属性を介してアクセス可能になります

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

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からGenericPrincipalを作成します

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;
    }
  }
126
David Glenn

MVC 4以降を使用している人は、David Glennの答えを利用するときにJaroslaw Waliszkoのアドバイスに従う必要があります。

「ASP.NET MVC 4でテストしましたが、代わりにApplication_PostAuthenticateRequestを使用することをお勧めします。そうしないと、汎用プリンシパルがオーバーライドされます。」 – Jaroslaw Waliszko 9月7日16時18分

したがって、前述のように、必要なことは、Application_AuthenticateRequestメソッド名をApplication_PostAuthenticateRequestに置き換えて、これを機能させることだけです。私にとって魅力のように働いた! JaroslawとDavidに賛成票を投じることが許可された場合、私はそうします。

5
Gareth

カスタムロールプロバイダーを作成したいだけです。ここの例:

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

3
DanH

承認ストアロールマネージャー または find(例:Codeplexで) または write にドロップすることはできませんかグループ情報を取得しますか?

これにより、ユーザーの認証、ロールの取得、その情報のコンストラクターへの再送信の手間が省け、フレームワークの一部として自動的に行われます。

1