web-dev-qa-db-fra.com

Stocker plus d'informations à l'aide de FormsAuthentication.SetAuthCookie

J'utilise aspx et c # pour définir un cookie d'authentification pour une connexion. 

FormsAuthentication.SetAuthCookie(UserName, True)

Je veux stocker plus d'informations dans le même cookie. Puis-je ajouter des valeurs à ce cookie d'authentification ou dois-je utiliser un second cookie http?

Fondamentalement, je cherche à ranger la Id de l'utilisateur pour pouvoir accéder à la base de données à l'aide de la clé de ligne de la table users

Merci, Eden

42
Eden

Vous pouvez ajouter des données utilisateur au FormsAuthenticationTicket, puis générer le cookie vous-même.

Il existe un exemple dans le la documentation MSDN pour FormsAuthenticationTicket .

MODIFIER

Notez que lors de la création du ticket, vous devez définir le délai d'expiration. En règle générale, vous voudrez qu'il soit identique à la valeur configurée dans web.config. Malheureusement, dans le Framework 3.5 ou antérieur, la classe FormsAuthentication n'expose pas publiquement ce délai d'expiration. Pour résoudre ce problème, utilisez l’une des techniques décrites dans la réponse à cet élément de commentaire de connexion .

METTRE À JOUR

Cet élément de rétroaction Connect n'est malheureusement plus là. J'aurais aimé que vous décriviez brièvement les techniques.

Oui, c'est dommage que Microsoft ait supprimé des éléments historiques de Connect. IIRC, les deux techniques suggérées sont les suivantes:

  1. Utilisez WebConfigurationManager pour lire la section de configuration appropriée et obtenir la valeur de délai d'attente.

  2. Créez un cookie à l'aide de FormsAuthentication.GetAuthCookie, déchiffrez-le à l'aide de FormsAuthentication.Decrypt et examinez la FormsAuthenticationTicket générée.

Ou effectuez une mise à niveau vers .NET 4.x où il existe une propriété FormsAuthentication.Timeout.

Voir cette question pour plus d'informations

47
Joe

Vous pouvez mettre ce que vous voulez dans le cookie d'authentification tant que cela vous est utile. Cela dit, si vous mettez des informations sensibles, vous devriez au moins les chiffrer, mais je vous déconseille de les y placer. Vous pouvez faire quelque chose comme:

Forms.SetAuthCookie (UserName + "|" + UserId, true);

Ensuite, chaque fois que vous avez besoin du nom d'utilisateur ou de l'identifiant de l'utilisateur, il est là. Il suffit de charger le cookie et d’analyser les valeurs dont vous avez besoin.

Encore une fois, je vous déconseille de le faire, d’autant plus que je l’ai présenté ci-dessus . Cela dit, c'est possible. Vous devriez créer des méthodes d'accès pour extraire les données:

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

Oui, il est judicieux d'utiliser "|" mettre plus d'infos. Si Microsoft a une autre méthode surchargée 

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

Notre vie sera alors beaucoup plus facile, notre code sera plus sûr. 

3
Ryan Liu

Transmettez cet ID utilisateur en tant que paramètre userName.

FormsAuthentication.SetAuthCookie(userId, True)

Comment sécurisez-vous vos billets d'authentification?

1
user134706

Vous pouvez stocker des informations supplémentaires dans la propriété UserData de la 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();
    }
}

Lectures supplémentaires: 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