web-dev-qa-db-fra.com

Comment vous connecter / authentifier un utilisateur avec Asp.Net MVC5 RTM bits en utilisant AspNet.Identity?

Toutes mes excuses et merci d'avance pour cette question! Je suis encore nouveau à SO.

Je travaille sur une application Web utilisant MVC5, EF6 et VS 2013.

J'ai passé quelque temps à mettre à niveau les bits RC une fois libérés. Merci à tous les excellents messages: par exemple. Découplage de Microsoft.AspNet.Identity. * et Mise à jour de asp.net MVC de 5.0.0-beta2 à 5.0.0-rc1 !

Dans mon infinie sagesse, j'ai décidé de passer aux RTM bits que @Hao Kung a publiés ici: Comment puis-je obtenir un accès rapide aux changements à venir dans Asp.Net Identity?? =. J'ai pensé que je gagnerais du temps et que je ne serais pas trop en retard lorsque nous aurons finalement reçu le build RTM.

C’était soit un cauchemar, soit il me manquait quelque chose (ou les deux), car je ne peux pas comprendre les tâches de base qui fonctionnaient avec le matériel RC1.

Bien qu'il semble que je connecte l'utilisateur via le contrôleur ( Où est Microsoft.AspNet.Identity.Owin.AuthenticationManager dans Asp.Net Identity RTM version? ) ... mon identifiant Windows est toujours vide et non authentifié après avoir appelé SignIn. Les objets utilisateur et ClaimsIdentity sont correctement renseignés.

Voici la méthode d'action que j'appelle (propriétés déplacées vers des variables locales pour plus de détails):

[HttpPost, AllowAnonymous, ValidateAntiForgeryToken]
public virtual async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid) {
        var userManager = new UserManager<EtdsUser>(new UserStore<EtdsUser>(new EtdsContext()));
        var user = userManager.Find(model.UserName, model.Password);
        if (user != null) {
            var authenticationManager = HttpContext.GetOwinContext().Authentication;
            authenticationManager.SignOut(new[] {DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.ExternalBearer});
            var claimsIdentity = await userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
            authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = model.RememberMe}, claimsIdentity);
            return RedirectToLocal(returnUrl);
        }
    }
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return View(model);
}

(Remarque: je n'ai pas besoin de connecter des utilisateurs externes pour le moment.)

Aucune suggestion? -ou- Dois-je annuler toutes mes modifications et attendre que VS 2013 soit RTMd?


Mise à jour, code refactorisé pour le rapprocher de la réponse originale de @Hao Kung. Cependant, je ne parviens toujours pas à obtenir une identité d'utilisateur valide. Je pense que mon AuthenticationManager n'est pas assigné correctement?

AuthenticationManger est maintenant défini comme:

public IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } }

SignInAsync est maintenant une méthode séparée:

private async Task SignInAsync(EtdsUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    var claimsIdentity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent}, claimsIdentity);
}

Après "SignOut", le débogueur affiche:

AuthenticationManager.User.Identity
{System.Security.Principal.WindowsIdentity}
    [System.Security.Principal.WindowsIdentity]: {System.Security.Principal.WindowsIdentity}
    AuthenticationType: ""
    IsAuthenticated: false
    Name: ""

"ClaimIdentity" est alors:

claimsIdentity
{System.Security.Claims.ClaimsIdentity}
    Actor: null
    AuthenticationType: "ApplicationCookie"
    BootstrapContext: null
    Claims: {System.Security.Claims.ClaimsIdentity.get_Claims}
    IsAuthenticated: true
    Label: null
    Name: "alon"
    NameClaimType: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
    RoleClaimType: "http://schemas.Microsoft.com/ws/2008/06/identity/claims/role"

"SignIn" ne change rien:

AuthenticationManager.User.Identity
{System.Security.Principal.WindowsIdentity}
    [System.Security.Principal.WindowsIdentity]: {System.Security.Principal.WindowsIdentity}
    AuthenticationType: ""
    IsAuthenticated: false
    Name: ""

Toujours pas d'authentification, mais il semble qu'aucune erreur ne soit générée.


Comme l'a répondu @Hao Kung, StartUp.Auth.cs a été remplacé par:

var authOptions = new CookieAuthenticationOptions { ExpireTimeSpan = TimeSpan.FromHours(4.0)};
app.UseCookieAuthentication(authOptions);

À:

var authOptions = new CookieAuthenticationOptions {
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    ExpireTimeSpan = TimeSpan.FromHours(4.0)
}; ...
46
ACG

Voici donc à quoi ressemblera la connexion dans RTM (code copié à partir de exemple de code d'ASPNET Identity =)):

    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.UserName, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

    private async Task SignInAsync(ApplicationUser user, bool isPersistent)
    {
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
        var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
        AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
    }

EDIT: Et vous avez besoin des changements suivants dans votre Startup.Auth.cs:

        app.UseCookieAuthentication(new CookieAuthenticationOptions {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
40
Hao Kung