我当前正在构建一个使用Azure B2C OIDC进行登录/身份验证的C#Net Core 2.2应用程序。我已经自定义登录页面,并且知道如何使用自定义页面布局使用托管在我网站上的CSS和代码来自定义编辑/忘记密码屏幕。
我遇到的问题是在注销时,我被重定向到/ AzureADB2C / Account / SignOut。我想像在登录页面中那样修改CSS,或者更改该URL以便转到在我的网站上托管的自定义控制器操作。
有人知道如何管理该过程吗?看起来奇怪的是,他们可以为所有“但”退出过程使用自定义布局。
作为一种解决方法,我发现可以添加“重写选项”以进行处理 登录网址,并将其重写为网站上的控制器。 但是,我不确定这是否是实现此目标的最佳方法 任务,它在一个非常晦涩的MSDN页面上,但是确实可以工作。见下文:
// Inside Startup.cs // Workaround for SignedOut URL error in MSFT code RewriteOptions rewrite = new RewriteOptions().AddRedirect("AzureADB2C/Account/SignedOut","Account/SignedOut"); app.UseRewriter(rewrite);
答案 0 :(得分:3)
[@ Marcel W提供的答案和@Sven提出的问题的其他信息]
参加聚会有点晚,但以防万一:
原始代码在以下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);
}
因此,想法是采用代码并在项目中创建相同的行为。
@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>
下面的屏幕快照说明了目录结构
答案 1 :(得分:2)
如果查看Microsoft.AspNetCore.Authentication.AzureADB2C.UI nuget程序包中AccountController的source code,您会看到callbackUrl硬编码为(/ AzureADB2C)/ Account / SignedOut。
但是不需要使用该控制器。只需在自己的控制器上调用自己的SignOut操作即可。复制并粘贴AzureADB2C SignOut操作中的代码,并将callbackUrl更改为您自己的代码。
编辑_LoginPartial.cshtml:删除asp-area =“ AzureADB2C”并使用自己的asp控制器和asp-action。
答案 2 :(得分:1)
我的解决方案基于上述答案
在您的控制器上
从Source Code复制粘贴SignOut的功能
您需要注入 IOptionsMonitor _azure(就我而言)
[HttpGet("logout/{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 = _azure.Get(scheme);
var callbackUrl = "/";
return SignOut(
new AuthenticationProperties { RedirectUri = callbackUrl },
options.AllSchemes);
}
之后,您只需要从您的视图或前端调用控制器
答案 3 :(得分:0)
当前,我们无法使用自定义页面布局直接自定义退出用户界面。
使用RewriteOptions()
方法是您的一种可选方法。或者,您可以只构建自己的AccountController,而不使用ASP.NET CORE随附的默认控制器。它们的原理是相同的。
答案 4 :(得分:0)
我想您正在使用用户流程(策略)来自定义登录/个人资料编辑/密码重置页面。您可能会注意到没有“注销”用户流,因此您无法在此处进行任何操作。
但是MS为您提供了另一种方式来拥有自己的注销后页面。从网络应用程序注销时,您应按照here的说明重定向到B2C的注销端点。 (注意:即使您不希望自定义退出页面,这也是您应该做的事情)
如果要使用户退出应用程序,仅清除应用程序的cookie或终止与用户的会话是不够的。将用户重定向到Azure AD B2C以注销。如果您这样做失败,则用户可以重新验证您的应用程序而无需再次输入其凭据。
注销端点可以在查询字符串中接收可选的 post_logout_redirect_uri 参数,您可以在其中指定另一个URL,最终将通过B2C将您的用户重定向到该URL。那可以是任何资源的地址,例如您的首页或您自己的页面向用户显示“您已成功退出我们的服务”消息。
post_logout_redirect_uri -成功注销后用户应重定向到的URL。 如果未包含,则Azure AD B2C会向用户显示一条通用消息。
答案 5 :(得分:0)
根据https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/127尝试此操作(为我工作):
对于MSA帐户,在以下情况下,注销页面应重定向回您的应用程序:
用户已使用/同意客户端应用
注销uri是https
注销uri已在门户中注册为答复uri
注销uri被注册为发布注销URL
注销uri在msal中设置为auth.postLogoutRedirectUri(您称为注销)。