web-dev-qa-db-ja.com

FormsAuthentication.SetAuthCookieを使用して詳細情報を保存する

ログイン用の認証Cookieの設定にaspxとc#を使用しています。

FormsAuthentication.SetAuthCookie(UserName, True)

同じCookieにさらに情報を保存したい。この認証Cookieに値を追加できますか、2つ目のHTTP Cookieを使用する必要がありますか?

基本的に、ユーザーのIdを保存する場所を探しているので、ユーザーテーブル行キーを使用してデータベースにアクセスできる場合があります。

ありがとう、エデン

43
Eden

FormsAuthenticationTicketにユーザーデータを追加してから、Cookieを自分で生成できます。

FormsAuthenticationTicketのMSDNドキュメント に例があります。

[〜#〜] edit [〜#〜]

チケットを作成するとき、タイムアウトを設定する必要があることに注意してください。一般に、web.configで設定された値と同じにしたいでしょう。残念ながら、Framework 3.5以前では、FormsAuthenticationクラスはこのタイムアウトを公開しません。回避策として、 this connect feedback item への応答で説明されている手法のいずれかを使用してください。

[〜#〜] update [〜#〜]

残念ながら、そのConnectフィードバックアイテムはもうありません。テクニックが何であるかを簡単に説明してください。

はい、Microsoftが過去のConnectアイテムを破棄したのは残念です。 IIRC、彼らが提案した2つのテクニックは次のとおりです。

  1. WebConfigurationManagerを使用して、関連する構成セクションを読み取り、タイムアウト値を取得します。

  2. FormsAuthentication.GetAuthCookieを使用してCookieを作成し、FormsAuthentication.Decryptを使用して復号化し、生成されたFormsAuthenticationTicketを検査します。

または、FormsAuthentication.Timeoutプロパティがある.NET 4.xにアップグレードします。

詳細については、 この質問 を参照してください

47
Joe

有用な限り、必要なものを認証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;
    }
}
15
andymeadows

はい、「|」を使用するのが賢明ですより多くの情報を入力します。 Microsoftに別のオーバーロードメソッドがある場合

public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)`

そうすれば私たちの生活はずっと楽になり、コードはより安全になります。

3
Ryan Liu

そのユーザーIDをuserNameパラメーターとして渡します。

FormsAuthentication.SetAuthCookie(userId, True)

認証チケットをどのように保護していますか?

1
user134706

UserDataFormsAuthenticationTicketプロパティに追加情報を保存できます。

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();
    }
}

さらに読む: https://docs.Microsoft.com/en-us/aspnet/web-forms/overview/older-versions-security/introduction/forms-authentication-configuration-and-advanced-topics-cs #step-4-storing-additional-user-data-in-the-ticket

0
dochoffiday