5

カスタム認証と承認を使用して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内のUserData1|に更新します。マネージャー

これは可能ですか、それとももっと良い方法がありますか?

どんな助けでも大歓迎です。

みんな、ありがとう。

4

2 に答える 2

1

コメントで述べたように、これは非常に使い勝手が悪いと感じています。ただし、これを行うことに決めた場合は、Dzenan のアプローチが機能します (基本的に、ユーザーが必要な役割を選択した後、他のすべての役割を取り除くだけです)。

もう 1 つの方法は、SelectedRole という追加のフィールドをユーザーデータに追加することです。次に、このフィールドを含むカスタム IPrincipal を作成します。

別のアプローチは、それを独自の Cookie として保存することですが、ユーザーが承認されていないロールを設定していないことを確認するようにします (つまり、SelectedRole=Admin を設定する場合は、ユーザーに管理者がいることを確認してください)。ロールを使用する前に)。

于 2013-05-19T21:53:36.773 に答える