カスタム認証と承認を使用してMVC 4 Web アプリケーションを作成しています。ユーザーがサイトにログインすると、FormsAuthenticationTicketを作成してCookieに保存します。
public void SignIn(string userName, bool createPersistentCookie, string UserData)
{
if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");
// Create and tuck away the cookie
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddDays(15), createPersistentCookie, UserData);
// Encrypt the ticket.
string encTicket = FormsAuthentication.Encrypt(authTicket);
//// Create the cookie.
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
HttpContext.Current.Response.Cookies.Add(faCookie);
}
UserData文字列はパイプで区切られた文字列で、常に少なくとも 2 つの項目UserID | UserIDが含まれます。ユーザーロール。ユーザーは 1 つ以上のロールに割り当てることができるため、UserData は次のようになります。ユーザーロール | ユーザーロール | ユーザーロール
次に、Global.asaxに独自のカスタムジェネリック プリンシパルがあります。
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
// Get the authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
// If the cookie can't be found, don't issue the ticket
if (authCookie == null) return;
// Get the authentication ticket and rebuild the principal
// & identity
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
string[] UserData = authTicket.UserData.Split(new Char[] { '|' });
GenericIdentity userIdentity = new GenericIdentity(authTicket.Name);
GenericPrincipal userPrincipal = new GenericPrincipal(userIdentity, UserData);
Context.User = userPrincipal;
}
これはすべて正常に機能しますが、私のアプリケーション内では、ユーザーが複数のロールを持っている場合、ログイン時にロールを一覧表示し、ロールを 1 つだけ選択して、選択したロールに基づいて機能を実行できるようにする必要があります。
これを行うには、ユーザーが選択したロールをメソッドに渡し、 FormsAuthenticationTicketを取得し、選択したロールを反映するようにUserDataを更新できるのではないかと考えていました。たとえば、UserData文字列が1|Manager|Applicantで作成された場合、両方のロールをリストし、機能を実行するロールをユーザーに尋ねる必要があります。ユーザーはManagerを選択し、 FormsAuthenticationTicket内のUserDataを1|に更新します。マネージャー。
これは可能ですか、それとももっと良い方法がありますか?
どんな助けでも大歓迎です。
みんな、ありがとう。