ログイン用の認証Cookieの設定にaspxとc#を使用しています。
FormsAuthentication.SetAuthCookie(UserName, True)
同じCookieにさらに情報を保存したい。この認証Cookieに値を追加できますか、2つ目のHTTP Cookieを使用する必要がありますか?
基本的に、ユーザーのId
を保存する場所を探しているので、ユーザーテーブル行キーを使用してデータベースにアクセスできる場合があります。
ありがとう、エデン
FormsAuthenticationTicketにユーザーデータを追加してから、Cookieを自分で生成できます。
FormsAuthenticationTicketのMSDNドキュメント に例があります。
[〜#〜] edit [〜#〜]
チケットを作成するとき、タイムアウトを設定する必要があることに注意してください。一般に、web.configで設定された値と同じにしたいでしょう。残念ながら、Framework 3.5以前では、FormsAuthentication
クラスはこのタイムアウトを公開しません。回避策として、 this connect feedback item への応答で説明されている手法のいずれかを使用してください。
[〜#〜] update [〜#〜]
残念ながら、そのConnectフィードバックアイテムはもうありません。テクニックが何であるかを簡単に説明してください。
はい、Microsoftが過去のConnectアイテムを破棄したのは残念です。 IIRC、彼らが提案した2つのテクニックは次のとおりです。
WebConfigurationManagerを使用して、関連する構成セクションを読み取り、タイムアウト値を取得します。
FormsAuthentication.GetAuthCookie
を使用してCookieを作成し、FormsAuthentication.Decrypt
を使用して復号化し、生成されたFormsAuthenticationTicket
を検査します。
または、FormsAuthentication.Timeout
プロパティがある.NET 4.xにアップグレードします。
詳細については、 この質問 を参照してください
有用な限り、必要なものを認証Cookieに入れることができます。つまり、機密情報を配置する場合は、少なくとも暗号化する必要がありますが、機密情報をそこに配置しないことをお勧めします。次のようなことができます:
Forms.SetAuthCookie (UserName + "|" + UserId, true);
次に、ユーザー名またはユーザーIDが必要なときはいつでもそこにあります。 Cookieをロードして、必要な値を解析するだけです。
繰り返しますが、特に上記で説明したように、これを行うことはお勧めしません。とはいえ、それは可能です。データを引き出すためのアクセサメソッドを作成する必要があります。
public int CurrentUserId
{
get
{
int userId = 0;
if (HttpContext.Current.Request.IsAuthenticated)
{
userId = Convert.ToInt32(HttpContext.Current.User.Identity.Name.Split('|')[1]);
}
return userId;
}
}
public string CurrentUserName
{
get
{
string userName = string.Empty;
if (HttpContext.Current.Request.IsAuthenticated)
{
userName = HttpContext.Current.User.Identity.Name.Split('|')[0];
}
return userName;
}
}
はい、「|」を使用するのが賢明ですより多くの情報を入力します。 Microsoftに別のオーバーロードメソッドがある場合
public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)`
そうすれば私たちの生活はずっと楽になり、コードはより安全になります。
そのユーザーIDをuserNameパラメーターとして渡します。
FormsAuthentication.SetAuthCookie(userId, True)
認証チケットをどのように保護していますか?
UserData
のFormsAuthenticationTicket
プロパティに追加情報を保存できます。
using Newtonsoft.Json;
using System.Web;
using System.Web.Security;
public class LoggedInUser
{
public string FirstName { get; set; } = null;
public bool IsAdmin { get; set; } = false;
}
public static class Authentication
{
static void SignIn(
HttpContextBase context,
string emailAddress,
bool rememberMe,
LoggedInUser user = null)
{
var cookie = FormsAuthentication.GetAuthCookie(
emailAddress.ToLower(),
rememberMe);
var oldTicket = FormsAuthentication.Decrypt(cookie.Value);
var newTicket = new FormsAuthenticationTicket(
oldTicket.Version,
oldTicket.Name,
oldTicket.IssueDate,
oldTicket.Expiration,
oldTicket.IsPersistent,
JsonConvert.SerializeObject(user ?? new LoggedInUser()));
cookie.Value = FormsAuthentication.Encrypt(newTicket);
context.Response.Cookies.Add(cookie);
}
static void SignOut(HttpContextBase context)
{
FormsAuthentication.SignOut();
}
static LoggedInUser GetLoggedInUser()
{
if (HttpContext.Current.User?.Identity?.Name != null && HttpContext.Current.User?.Identity is FormsIdentity identity)
return JsonConvert.DeserializeObject<LoggedInUser>(identity.Ticket.UserData);
return new LoggedInUser();
}
}