[@Marcel W 提供的答案和@Sven 提出的问题的其他信息]
聚会有点晚了,但万一它可以帮助别人:
- Blazor 服务器应用 .net core 3.1
- 身份验证:Azure B2C
原代码在下面repository
不幸的是,在注销方法中,回调 url 是硬编码的。
[HttpGet("{scheme?}")]
public async Task<IActionResult> SignOut([FromRoute] string scheme)
{
scheme = scheme ?? AzureADB2CDefaults.AuthenticationScheme;
var authenticated = await HttpContext.AuthenticateAsync(scheme);
if (!authenticated.Succeeded)
{
return Challenge(scheme);
}
var options = _options.Get(scheme);
var callbackUrl = Url.Page("/Account/SignedOut", pageHandler: null, values: null, protocol: Request.Scheme);
return SignOut(
new AuthenticationProperties { RedirectUri = callbackUrl },
options.AllSchemes);
}
所以想法是获取代码并在项目中创建相同的行为。
- 创建区域文件夹
- 在 Areas 文件夹中创建 AzureADB2C 文件夹
- 在 AzureADB2C 文件夹中创建 Pages 文件夹
- 在 Pages 文件夹中创建 Account 文件夹
- 在 Account 文件夹中创建 SignOut.cshtml 文件
- 复制/粘贴以下代码
@page
@using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Authentication.AzureADB2C.UI
@using Microsoft.Extensions.Options
@inject IOptionsMonitor<AzureADB2COptions> Options
@attribute [IgnoreAntiforgeryToken]
@functions {
public async Task<IActionResult> OnPost([FromRoute] string scheme)
{
scheme = scheme ?? AzureADB2CDefaults.AuthenticationScheme;
var authenticated = await HttpContext.AuthenticateAsync(scheme);
if (!authenticated.Succeeded)
{
return Challenge(scheme);
}
var options = Options.Get(scheme);
var callbackUrl = Url.Page("/", pageHandler: null, values: null, protocol: Request.Scheme);
return SignOut(
new AuthenticationProperties { RedirectUri = callbackUrl },
options.AllSchemes);
}
}
最后的修改将在 LoginDisplay.razor 文件中进行。我们需要创建一个表单来完成我们的“发布”以签署用户
替换此文件中的以下行
<a href="AzureADB2C/Account/SignOut">Log out</a>
由
<form method="post" action="AzureADB2C/Account/SignOut">
<button type="submit" class="nav-link btn btn-link">Log out</button>
</form>
下面是说明目录结构的屏幕截图