MVCを使用するようにサイトをアップグレードし、認証をセットアップするための最良の方法を探しています。
この時点で、Active Directoryからログインできます。ユーザー名とパスワードを検証してから、認証Cookieを設定します。
ユーザーがサイト内を移動するときにコントローラーがこれらのロールを表示できるように、ログイン時にユーザーのロール情報を保存するにはどうすればよいですか?
[Authorize(Roles = "admin")]
Active Directoryからロールのリストを取得しても問題ありません。コントローラーがそれらを見ることができるように、どこに置いたらよいかわかりません。
ユーザーを認証すると、新しい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;
}
}
MVC 4以降を使用している人は、David Glennの答えを利用するときにJaroslaw Waliszkoのアドバイスに従う必要があります。
「ASP.NET MVC 4でテストしましたが、代わりにApplication_PostAuthenticateRequestを使用することをお勧めします。そうしないと、汎用プリンシパルがオーバーライドされます。」 – Jaroslaw Waliszko 9月7日16時18分
したがって、前述のように、必要なことは、Application_AuthenticateRequestメソッド名をApplication_PostAuthenticateRequestに置き換えて、これを機能させることだけです。私にとって魅力のように働いた! JaroslawとDavidに賛成票を投じることが許可された場合、私はそうします。
カスタムロールプロバイダーを作成したいだけです。ここの例:
承認ストアロールマネージャー または find(例:Codeplexで) または write にドロップすることはできませんかグループ情報を取得しますか?
これにより、ユーザーの認証、ロールの取得、その情報のコンストラクターへの再送信の手間が省け、フレームワークの一部として自動的に行われます。