更改Azure AD B2C注销URL(将AzureADB2C / Account / SignedOut更改为自定义URL)

时间:2019-07-08 00:23:41

标签: c# azure azure-ad-b2c

我当前正在构建一个使用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);

6 个答案:

答案 0 :(得分:3)

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

因此,想法是采用代码并在项目中创建相同的行为。

  1. 创建区域文件夹
  2. 在Areas文件夹中创建AzureADB2C文件夹
  3. AzureADB2C文件夹中的“创建页面”文件夹
  4. 在Pages文件夹内创建Account文件夹
  5. 在“帐户”文件夹中创建SignOut.cshtml文件
  6. 复制/粘贴以下代码

@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>

下面的屏幕快照说明了目录结构

enter image description here

答案 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(您称为注销)。