我从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和脚手架类之间有什么区别?
答案 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实现中所示。