Où stocker les informations utilisateur ASP.NET MVC utilisant L'authentification Forms?

j'utilise ASP.NET MVC and Forms Authentication on my application. En gros, j'utilise FormsAuthentication.SetAuthCookie pour me connecter et FormsAuthentication.SignOut pour me déconnecter.

Dans le HttpContext.Actuel.Utilisateur.Identité j'ai stocké le nom d'utilisateur mais j'ai besoin de plus d'informations sur l'utilisateur connecté. Je ne veux pas stocker tout mon objet utilisateur dans la Session parce qu'il pourrait être grand et avec beaucoup plus d'informations que je n'ai besoin.

tu crois que c'est une bonne idée de créer comme une classe appelé LoggedUserInfo avec seulement les attributs dont j'ai besoin et ensuite l'ajouter à la Session variable ? Est-ce une bonne approche?

ou avez-vous de meilleures idées?

21
demandé sur Leniel Maccaferri 2009-11-30 21:08:03

4 réponses

j'utilise cette solution:

ASP.NET 2.0 authentification des formulaires-le conserver personnalisé et simple

pour résumer: j'ai créé ma propre implémentation principale. Il est stocké dans HttpContext.Actuel.Cache. S'il est perdu, j'ai le nom d'utilisateur du cookie d'autorisation côté client et je peux le reconstruire. Cette solution ne repose pas sur la Session, qui peut être facilement perdue.

EDIT

si vous voulez utiliser votre principal dans votre controller et le rendre testable, vous pouvez le faire:

    private MyPrincipal _myPrincipal;
    MyPrincipal MyPrincipal
    {
        get
        {
            if (_myPrincipal == null)
                return (MyPrincipal)User;
            return _myPrincipal;
        }
        set
        {
            _myPrincipal = value;
        }
    }

dans votre test, vous définirez l'objet préparé pour le test. Sinon, il sera repris de HttpContext. Et maintenant je me suis dit, Pourquoi J'utilise Ninject pour le faire?

7
répondu LukLed 2013-05-15 12:23:44

j'aime en fait utiliser un principe personnalisé et identité personnalisée que j'ai mis dans la méthode d'action de connexion comme

        if (!String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password) && _authService.IsValidLogin(username, password))
        {
            User objUser = _userService.GetUserByName(username);
            if (objUser != null)
            {
                //** Construct the userdata string
                string userData = objUser.RoleName + "|" + objUser.DistrictID + "|" + objUser.DistrictName + "|" + objUser.ID + "|" + objUser.DisplayName;
                HttpCookie authCookie = FormsAuthentication.GetAuthCookie(username, rememberMe.GetValueOrDefault());
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
                FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, userData);
                authCookie.Value = FormsAuthentication.Encrypt(newTicket);
                Response.Cookies.Add(authCookie);
                return RedirectToAction("Index", "Absence");
            }
            else
            {
                return RedirectToAction("LogOn", "Account");
            }
        }
        else
        {
            return RedirectToAction("LogOn", "Account");
        }

alors dans le principal personnalisé vous pouvez avoir des méthodes qui accèdent à des informations spécifiques que vous avez transmises au constructeur comme

((CustomIdentity)((CustomPrincipal)HttpContext.Current.User).Identity).DisplayName;

où la propriété DisplayName est déclarée dans la classe CustomIdentity.

4
répondu user205258 2009-12-01 22:05:15

stocker le côté serveur it dans la session.

par exemple.

// Make this as light as possible and store only what you need
public class UserCedentials
{
    public string Username { get; set; }
    public string SomeOtherInfo { get; set; }
    // etc...
}

puis quand ils s'inscrivent juste faire ce qui suit pour sauver les informations des utilisateurs:

// Should make typesafe accessors for your session objects but you will
// get the point from this example
Session["UserCredentials"] = new UserCredentials()
    { Username = "SomeUserName", SomeOtherInfo = "SomeMoreData" };

ensuite, quand vous en avez besoin, allez le chercher:

UserCredentials user = (UserCredentials)(Session["UserCredentials"]);

j'ai écrit quelques questions / réponses concernant l'autorisation personnalisée dans MVC: comment mettre en œuvre les contrôles d'autorisation dans ASP.NET MVC basé sur les données de la Session?

Comment fonctionne L'étiquette D'autorisation? - Asp.net Mvc

3
répondu Kelsey 2017-05-23 11:54:56

eh Bien, vous aurez à stocker ces quelque part. Deux endroits principaux possibles cependant:

le serveur

vous pouvez soit les mettre en Session. Je vous suggère de créer une classe séparée qui ne contiendra que les données dont vous avez réellement besoin pour éviter de gaspiller trop de mémoire. Ou vous pouvez également stocker dans le Cache qui peut finir par avoir de nombreux appels DB quand il ya d'énormes quantités d'utilisateurs concurrents.

le client

dans ce cas si vous pouvez limiter la quantité de données avec une classe séparée, à cela et utiliser n'importe quel moyen pour sérialiser et envoyer au client. Soit dans un cookie ou dans un URI (si la longueur le permet et les cookies sont désactivés)...

résultat de ces pensées:

la chose principale serait de créer une catégorie distincte si vous gagnez beaucoup de ressources en mémoire de cette façon. Donc, c'est la première chose que vous devriez faire.

2
répondu Robert Koritnik 2009-11-30 18:24:19