Wie können Sie einen Benutzer mit Asp.Net MVC5 RTM-Bits über AspNet.Identity anmelden / authentifizieren?

Entschuldigung und vielen Dank im Voraus für diese Frage! Ich bin noch neu in SO.

Ich habe auf einer web-Anwendung mit MVC5, EF6, und VS 2013.

Verbrachte ich einige Zeit ein Upgrade auf die RC bits einmal veröffentlicht. Vielen Dank an alle die so tolle Beiträge, die es gibt: zB. Die Entkopplung Von Microsoft.AspNet.Identität.* und Aktualisierung asp.net MVC von 5.0.0-beta2 auf 5.0.0-rc1 !

In meiner unendlichen Weisheit habe ich beschlossen, um die RTM-bits, @Hao Kung geschrieben über hier: Wie erhalte ich frühen Zugang zu kommenden Asp.Net Identität ändert?. Ich dachte, ich würde, sparen Sie sich die Mühe und nicht zu weit hinter sich, wenn wir Sie schließlich erhalten die RTM-build.

Diese hat entweder ein Alptraum oder bin ich einfach nur komplett fehlt etwas (oder beide), da ich nicht herausfinden können, grundlegende Aufgaben, hatte mit der RC1-Zeug.

Während es scheint, wie ich bin, Protokollierung der Benutzer über den controller (Wo ist Microsoft.AspNet.Identität.Owin.AuthenticationManager in Asp.Net Identität RTM-version?) ... meine WindowsIdentity ist immer leer und nicht authentifiziert, nachdem ich den Anruf An. Die Benutzer-und "claimsIdentity" - Objekt sind korrekt ausgefüllt.

Hier wird die action Methode, die ich Vorschlage, (bewegt-Eigenschaften auf lokalen Variablen auf Vollständigkeit):

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

(On a side note: ich nicht brauchen, um sich in externen Benutzer zu diesem Zeitpunkt.)

Irgendwelche Vorschläge?
-oder-
Sollte Rolle ich wieder alle meine änderungen, und warten Sie einfach, bis VS 2013 ist RTMd?


Update, Refactoring-code, um es näher zu @Hao Kung ursprünglichen Antwort. Allerdings habe ich noch nicht am Ende mit einem gültigen Benutzer-Identität. Ich denke, dass meine AuthenticationManager ist nicht richtig zugewiesen?

AuthenticationManger ist nun definiert als:

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

SignInAsync ist jetzt eine separate Methode:

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

Nach "SignOut", der debugger zeigt:

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

"ClaimsIdentity" ist dann:

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" nichts ändern:

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

Immer noch keine Authentifizierung, aber scheint, dass keine Fehler geworfen werden.


Als beantwortet @Hao Kung, StartAnimation.Auth.cs aus:

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

InformationsquelleAutor der Frage ACG | 2013-09-30

Schreibe einen Kommentar