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