ユーザーがサインアウトするときにセキュリティスタンプを更新する方法は?

asp.net-core asp.net-core-mvc c# entity-framework entity-framework-core

質問

ユーザーがサインアウトするときにsecurity stampを更新する方法は?

ユーザーがサインアウトするときにsecurity stampを更新することは可能ですか?

私のコード:

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

エラー:

エンティティタイプ 'User'のインスタンスは、同じキーを持つこのタイプの別のインスタンスがすでに追跡されているため、追跡できません。新しいエンティティについては、IIdentityGeneratorを使用して一意のキー値を生成することを検討してください。

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

        }

人気のある回答

このコードを使用します:

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


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ