ASP.NET核心身份-脚手架身份后,LoginPartial损坏

时间:2019-06-26 11:33:55

标签: c# asp.net-core asp.net-core-2.2 asp.net-core-identity

我从VS 2017模板(具有单个用户帐户的Web应用程序)中创建了一个新项目。

这会将ASP.NET Core身份添加为默认UI(使用来自nuget的UI)。

  services
    .AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

使用此nuget,一切都可以按预期进行。特别是loginPartial,它在用户登录后显示用户名,并在单击注销后立即显示“登录”按钮。

一旦我搭建好布局并应用更改(根据the guide in the docs),注销就不会删除名称,也不会显示登录按钮(在单击注销后立即显示)。仅当我单击另一个页面的链接时,更改才会发生。

我当然更改了配置(根据指南):

 services
   .AddIdentity<Data.Entities.ApplicationUser, IdentityRole>()
   .AddEntityFrameworkStores<ApplicationDbContext>()
   .AddDefaultTokenProviders();

有人知道如何解决此问题,或者DefaultUI和脚手架类之间有什么区别?

1 个答案:

答案 0 :(得分:3)

有一个GitHub issue描述了您遇到的确切问题。在脚手架之前您间接使用的Razor类库(RCL)实现在OnPost中有一个Logout.cshtml.cs实现,看起来像this

public override async Task<IActionResult> OnPost(string returnUrl = null)
{
    await _signInManager.SignOutAsync();
    _logger.LogInformation("User logged out.");
    if (returnUrl != null)
    {
        return LocalRedirect(returnUrl);
    }
    else
    {
        // This needs to be a redirect so that the browser performs a new
        // request and the identity for the user gets updated.
        return RedirectToPage();
    }
}

正如内嵌注释所解释的那样,必须使用RedirectToPage来确保标识在清除后重新加载。如果您查看此方法的脚手架版本,则会发现它在else分支中具有以下内容:

return Page();

就是这个问题。没有重定向,因此没有重新加载身份。您可以通过将其切换为使用RedirectToPage来解决该问题,如我在上面提到的RCL实现中所示。