Comment vous connecter / authentifier un utilisateur avec Asp.Net MVC5 RTM bits en utilisant AspNet.L'identité?

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

J'ai travaillé sur une application web utilisant MVC5, EF6 et VS 2013.

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

Dans ma sagesse infinie, j'ai décidé de passer aux bits RTM sur lesquels @Hao Kung a posté ici: Comment puis-je obtenir un accès anticipé à venir Asp.Net changements D'identité?. J'ai pensé que je sauverais le problème et ne serais pas trop loin derrière quand nous recevrions finalement la construction RTM.

Cela a été soit un cauchemar, soit je manque complètement quelque chose (ou les deux) car je ne peux pas comprendre les tâches de base qui avaient travaillé avec les trucs RC1.

Alors qu'il semble que je connecte l'utilisateur via le contrôleur ( Où est Microsoft.AspNet.Identité.Owin.AuthenticationManager dans Asp.Net identité version RTM?) ... mon WindowsIdentity est toujours vide et non authentifié après avoir appelé SignIn. L'objet user 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 être complètes):

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

(sur une note de côté: je n'ai pas besoin de me connecter à des utilisateurs externes pour le moment.)

Des suggestions? -ou- Dois-je annuler toutes mes modifications et juste attendre JUSQU'à ce que VS 2013 est RTMd?


Mise à jour, code refactorisé pour le rendre plus proche de la réponse originale de @Hao Kung. Cependant, je ne me retrouve toujours pas avec une identité d'utilisateur valide. Je pense que mon AuthenticationManager n'est pas attribué correctement?

AuthenticationManger est maintenant défini comme:

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

SignInAsync est maintenant une méthode distincte:

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 "déconnexion", le débogueur affiche:

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

La "claimsIdentity" 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 pas tout:

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

Toujours pas D'authentification, mais semble qu'aucune erreur n'est levée.


Comme répondu par @Hao Kung, changé de démarrage.Auth.cs de:

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)
}; ...
45
demandé sur Community 2013-09-30 13:48:33

1 réponses

Voici donc à quoi ressemblera la connexion dans RTM (code copié à partir de l'exemple de code 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 de suivi dans votre démarrage.Auth.cs:

        app.UseCookieAuthentication(new CookieAuthenticationOptions {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
39
répondu Hao Kung 2014-11-12 16:17:40