1

たとえば、ユーザーがログインしている場合、ユーザー ID および/またはその役割/グループを保存するための最良の方法は何でしょうか? 明白なアプローチはクッキーとセッションですか? 他のオプションは?

4

2 に答える 2

0

少なくとも、フォーム認証を使用すると、ユーザー ID とロールを Formst Auth チケットに入れることができます。

これが私がそれをした方法の例です:

    public static HttpCookie CreateCookie(IUserIdValue userId, string name, IEnumerable<int> group, bool isPersistent = false)
    {
        var user = new AuthenticationTicketData() { Groups = @group, UserId = userId };
        var ft = new FormsAuthenticationTicket(2, name, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout),
                                               isPersistent, user.Pack());
        var ck = new HttpCookie(FormsAuthentication.FormsCookieName)
                     {
                         Value = FormsAuthentication.Encrypt(ft),
                         Path = FormsAuthentication.FormsCookiePath,
                         Domain = FormsAuthentication.CookieDomain
                     };
        if (isPersistent)
        {
            ck.Expires = DateTime.Now.Add(FormsAuthentication.Timeout);
        }
        return ck;
    }


 public static string Pack(this AuthenticationTicketData data)
    {
        if (data == null) throw new ArgumentNullException("data");
        return String.Format("{0};{1}",PackUserId(data.UserId),string.Join(",",data.Groups));
    }

    static string PackUserId(IUserIdValue uid)
    {
        if (uid == null) throw new ArgumentNullException("uid");
        var tpn = uid.GetType().GetFullTypeName();
        return String.Format("{0}|{1}",tpn,uid.ToString());
    }

 public static HttpCookie SetAuthCookie(this HttpResponse response,IUserIdValue userId, string name, IEnumerable<int> group, bool isPersistent = false)
    {
        var ck = CreateCookie(userId, name, group, isPersistent);
        response.AppendCookie(ck);
        return ck;
    }

もう 1 つの方法は、テーブル (guid、username、userid、roles、expireAt) のようなデータベースにユーザー セッション (Session とは無関係) を保持することです。ただし、このアプローチは、ユーザーがいつログイン/ログアウトしたかを追跡したい場合、または独自の認証 (フォーム認証ではない) を使用している場合に適しています。

于 2013-04-06T08:38:07.613 に答える