2016-05-11 22 views
2

Ich benutze RC1 Bits und externe (Google) Authentifizierung, keine Identity.EntityFramework.ASP.NET 5 Identity 3 Benutzer werden nach einiger Zeit abgemeldet

Während der Anmeldung habe ich 'Remember me' gesetzt.

Der angemeldete Benutzer überlebt den Neustart des Browsers (ich sehe, dass der Cookie in 14 Tagen abläuft) und der Neustart der Website.

Aber nach einiger Zeit der Inaktivität (ca. 15 min), wurden ganz gleich Browser/Website neu gestartet oder nicht, Seite führen erfrischend zu dem Abmelden meldet sich sagt:

info: Microsoft.AspNet.Authentication.Cookies.CookieAuthenticationMiddleware: 
    AuthenticationScheme: Microsoft.AspNet.Identity.Application signed out. 
    AuthenticationScheme: Microsoft.AspNet.Identity.External signed out. 
    AuthenticationScheme: Microsoft.AspNet.Identity.TwoFactorUserId signed out. 

Das ist wie „Sitzungen“ sieht in vorherige ASP, aber ich verwende keine Sitzungen hier.

Dies ist meine lokalen Entwickler-Maschine, keine IIS, direkte Kestrel Verbindung zum 5000-Port, so dass dies nicht data-protection problem

Warum Benutzer abzumelden gezwungen?

aktualisieren: meine Startup.cs Datei:

public void ConfigureServices(IServiceCollection services) 
{ 
    .... 
    var identityBuilder = services 
     .AddIdentity<User, UserRole>(options => 
     { 
      options.User.AllowedUserNameCharacters = null; 
      options.Cookies.ApplicationCookie.LoginPath = "/user/login"; 
      options.Cookies.ApplicationCookie.LogoutPath = "/user/logout"; 
     }); 
    identityBuilder.Services 
     .AddScoped<IUserStore<User>, SportCmsDb>(serviceProvider => serviceProvider.GetService<SportCmsDb>()) 
     .AddScoped<IRoleStore<UserRole>, SportCmsDb>(serviceProvider => serviceProvider.GetService<SportCmsDb>()); 
    identityBuilder 
     .AddDefaultTokenProviders(); 
    .... 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    .... 
    app.UseIdentity(); 
    app.UseGoogleAuthentication(options => 
    { 
     options.ClientId = Configuration["OAuth:Google:ClientId"]; 
     options.ClientSecret = Configuration["OAuth:Google:Secret"]; 
    }); 
    .... 

SportCmsDb ist DbContext und implementiert auch IUserStore<User>, IUserLoginStore<User>, IUserEmailStore<User>, IRoleStore<UserRole>, IUserClaimStore<User>

aktualisieren 2

I aktiviert Deta iloged (debug) Protokollierung und festgestellt, dass, wenn Benutzer abgemeldet werden - vorher mein IUserStore<User>.FindByIdAsync aufgerufen wird. Mit realer/existierender Benutzer-ID und Funktion, die den richtigen Nicht-Null-Benutzer zurückgibt. Alles scheint gut zu sein. Aber meine loaded-from-db User ist "abgelehnt" und gezwungen, sich abzumelden. Es gibt keine zusätzlichen Protokollmeldungen, die den Grund/den Ort aufdecken können.

+0

Konnten Sie Ihren Anruf zu services.AddIdentity in ConfigureServices einschließen, oder haben Sie das vollständig entfernt? Verwenden Sie noch 'app.UseIdentity();' in der Startup.Configure-Methode? –

+0

Meine Post mit Teilen von 'Startup.cs' aktualisiert. – Dmitry

Antwort

6

Wow, ich habe es gelöst!

TL; DR

brauche ich IUserSecurityStampStore<User> auf meinem benutzerdefinierten UserManager (aka SportCmsDb) zu implementieren.

Einzelheiten

Während AddIdentity Aufruf (in Startup.csConfigureServices Methode) IdentityOptions are configured mit default instance of IdentityCookieOptions. Im Konstruktor der IdentityCookieOptions Instanz von ApplicationCookie (vom Typ CookieAuthenticationOptions) wird mit Handler CookieAuthenticationEvents.OnValidatePrincipalset to SecurityStampValidator.ValidatePrincipalAsync statische Methode erstellt.

Während UseIdentity Anrufs (in Startup.csConfigure Methode) CookieAuthenticationMiddlewareconfigured with IdentityOptions.Cookies.ApplicationCookie options ist.

CookieAuthenticationHandler (erstellt von CookieAuthenticationMiddleware) in seiner HandleAuthenticateAsync Methode Ticket Cookie liest und für die Validierung Options.Events.ValidatePrincipal Handler aufrufen.

Effektiv wird SecurityStampValidator.ValidatePrincipalAsync aufgerufen. Diese Methode überprüft, dass enough time has elapsed seit dem Ausgeben des Cookies (30 min by default) und ISecurityStampValidator.validateAsync (Zeilen 81-82) aufgerufen wurde.

Die Standardimplementierung von ISecurityStampValidator ist SecurityStampValidator<TUser>. Es ruft SignInManager<TUser>.ValidateSecurityStampAsync an und wenn null zurückgegeben wird, lehnt Principle ab und zwingt Benutzer, sich abzumelden (Zeilen 30-40).

SignInManager<TUser> in seiner ValidateSecurityStampAsync method versucht Sicherheit Stempel aus User zu lesen und den Wert null zurück, wenn es nicht kann (wenn UserManager<User> diese Schnittstelle nicht funktioniert unterstützt) oder Stempel nicht ein (in Cookie) gespeichert überein.

Meine benutzerdefinierte UserManager implementiert IUserSecurityStampStore<User> nicht. Bingo.

+0

Hallo, ich habe die 'IUserSecurityStampStore'-Schnittstelle in meinem benutzerdefinierten UserStore implementiert und den Stempel einfach im Benutzer gespeichert (' SetSecurityStampAsync') und zurückgegeben ('GetSecurityStampAsync'), aber die Set-Methode wurde nie genannt? In der 'ValidateSecurityStampAsync'-Methode aus dem asp.net-Code sah ich, dass sie eine Forderung mit dem Namen' SecurityStampClaimType' abrufen? Wer ist dafür verantwortlich, diesen Anspruch geltend zu machen? Mich ? In meinem Fall habe ich keinen benutzerdefinierten UserManager oder SignInManager, nur der Speicher ist benutzerdefiniert und da bekomme ich nur den Benutzer, überhaupt keine Benutzer zu erstellen. –

+1

Sie sollten 'SetSecurityStampAsync' nur dann manuell aufrufen, wenn Sie den Benutzer neu anmelden müssen (zB nachdem Sie seine Rollen/Rechte von der Admin-Seite geändert haben). Claim "SecurityStampClaimType" ist "intern" gesetzt (mit Benutzer-ID und Namensansprüchen), mach dir keine Sorgen darüber. Aber Sie sollten einen anfänglichen Sicherheitsstempelwert haben - 'GetSecurityStampAsync' sollte nicht null zurückgeben. – Dmitry

+0

Okey, ich dachte, alles sollte stimmen, aber kein Erfolg :(Ich habe den Stempel Wert in den Ansprüchen, aber die 'GetSecurityStampAsync' (Rückgabe der gleichen Wert, den ich in den Anspruch setzen) nie angerufen .. 30 Minuten warten auf einen Test ist hart :) –

Verwandte Themen