1

Wie aktualisiert man security stamp wenn Benutzer abmelden?Wie wird der Sicherheitsstempel aktualisiert, wenn der Benutzer sich abmeldet?

ist es möglich, security stamp zu aktualisieren, wenn Benutzer abmelden?

mein Code:

public class SignInManager : SignInManager<User>, ISignInManager 
    { 
     // other 
     public override async Task SignOutAsync() 
     { 
      await _userManager.UpdateSecurityStampCurrentUserAsync(); 
      await base.SignOutAsync(); 
     } 
    } 

public async Task<IdentityResult> UpdateSecurityStampCurrentUserAsync() 
     { 
      return await UpdateSecurityStampAsync(GetCurrentUser());//error 
     } 

     public User GetCurrentUser() 
     { 
      if (_httpContextAccessor.HttpContext.User == null) 
      { 
       return null; 
      } 
      var userId = Guid.Parse(_httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value); 
      return currentUser ?? (currentUser = _users.First(d => d.Id == userId)); 
     } 

Fehler:

Die Instanz des Entity-Typ ‚Benutzer‘ kann nicht verfolgt werden, da eine andere Instanz dieses Typs mit dem gleichen Schlüssel bereits verfolgt wird. Bei neuen Entitäten sollten Sie einen IIdentityGenerator verwenden, um eindeutige Schlüsselwerte zu generieren.

ConfigureServices:

public void ConfigureServices(IServiceCollection services) 
     { 
      // Add framework services. 
      services.AddDbContext<DotNetContext>(options => 
       options.UseSqlServer(Configuration.GetConnectionString("DotNetConnection"))); 

      services.AddIdentity<User, Role>() 
       .AddEntityFrameworkStores<DotNetContext, Guid>() 
       .AddUserManager<UserManager>() 
       .AddRoleManager<RoleManager>() 
       .AddUserStore<UserStore>() 
       .AddDefaultTokenProviders(); 

      services.AddMvc(); 
      // Services 
      services.AddScoped<IUserManager, UserManager>(); 
      services.AddScoped<IRoleManager, RoleManager>(); 
      services.AddScoped<ISignInManager, SignInManager>(); 
      services.AddScoped<IUserStore, UserStore>(); 

     } 
+0

In 'GetCurrentUser': warum nicht einfach zurückgeben' _httpContextAccessor.HttpContext.User'? Warum versuchen Sie, denselben Benutzer aus der Datenbank erneut zu laden? – Dmitry

+0

weil: kann nicht von 'System.Security.Claims.ClaimsPrincipal' zu 'Data.Entities.Identities.User' konvertiert werden – StackOverflow4855

+0

Haben Sie versucht [vorhanden] (https://github.com/aspnet/Identity/blob/1.0.0 -rc2/src/Microsoft.AspNetCore.Identity/UserManager.cs # L347) 'UserManager.GetUserAsync (ClaimsPrincipal Principal)' anstatt eigene Implementierung zu schreiben? – Dmitry

Antwort

1

Mit diesem Code:

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> LogOff() 
{ 
    var user = await _userManager.FindByNameAsync(User.Identity.Name); 
    _authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
    await _userManager.UpdateSecurityStampAsync(user.Id); 

    return RedirectToAction("Index", "Home"); 
} 
Verwandte Themen