5

我正在尝试使用 Azure AD B2C 运行ASP.NET Core 2.1 Web 应用程序。我在经过大量研究(以及更多的试验和错误)后运行了这个,因为文档中的说明有点偏离。

登录/注册过程使用项目设置向导期间的默认脚手架,加上新的Microsoft.AspNetCore.Authentication.AzureADB2C.UI Nuget,这在启动过程中产生了简化但“后备箱”的体验。

目前的问题是我无法使用不同于“signin-oidc”的自定义回复 URL 来完成这项工作。我已经读过“signin-oidc”以某种方式被嵌入到提供程序中,因此是默认设置。

我定义OnboardingController了一个Start操作,我希望用户在注册后登陆,所以我做了以下事情:

  • A)我测试了 URL 是否localhost:12345/Onboarding/Start有效。页面显示正确。
  • B)在 appsettings.json 我将 AzureAdB2C 更改"CallbackPath": "/signin-oidc""CallbackPath": "/Onboarding/Start" 应用设置
  • C) 我去租户并将应用程序的回复 URL 更改为localhost:12345/Onboarding/Start. 重要附注:与 ADB2C 示例和指南不同,您必须在回复 URL 后附加 signon-oidc 或自定义请求路径!本地主机:12345 还不够! 租户配置

    我可以确认身份验证有效: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler:Information: AuthenticationScheme: AzureADB2CCookie 已登录。Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: 请求在 56.201 毫秒内完成

然后,当我在浏览器中手动导航到 /Onboarding/Start 时,我得到

来自 RemoteAuthentication 的错误:关联失败。

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:12345/Onboarding/start  
Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler:Warning: .AspNetCore.Correlation. state property not found.
Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler:Information: Error from RemoteAuthentication: Correlation failed..

1. 但我从未被重定向到预期/开始页面。相反,我回到了根主页,就像我使用“signin-oidc”时发生的情况一样。为什么会这样,我如何让它停止去那里?

2. 我怎样才能让回复 URL 因您是登录还是 UP 不同而有所不同?我真的不能对一个使用注册策略,对另一个使用单独的登录策略,因为回复 URL 是相同的。

我是 .Net Core 的新手,我什至不知道如何调试它。使用 B2C 登录似乎是一个晦涩难懂的过程。任何见解将不胜感激。

编辑:这是自定义帐户控制器,它未内置在 AzureADB2C 的 Nuget 包中。虽然 Nuget 包提供了一个内部 AccountController,但它不允许您设置自定义回复 URL。然而,使用我自己的帐户控制器对我不起作用。我也没有收到“相关失败”错误,而是完全没有错误。

[Route( "[controller]/[action]" )]
    public class AccountController : Controller
    {
        private readonly AzureADB2COptions azureAdB2COptions;
        private const string PolicyAuthenticationProperty = "Policy";
        private string scheme = AzureADB2CDefaults.AuthenticationScheme;

        public AccountController( IOptions<AzureADB2COptions> b2cOptions )
        {
            azureAdB2COptions = b2cOptions.Value;
        }

        [HttpGet]
        [Route( "/[controller]/SignIn" )]
        public IActionResult SignIn()
        {
            var callbackUrl = Url.Action( nameof( OnboardingController.Start ), "Onboarding", values: null, protocol: Request.Scheme );
            var properties = new AuthenticationProperties { RedirectUri = callbackUrl };
            properties.Items[PolicyAuthenticationProperty] = azureAdB2COptions.SignUpSignInPolicyId;

            return this.Challenge( properties, scheme );
        }

B2C 的 startup.cs 代码与为我生成的默认 .NETCore 2.1 模板相同:

    services.AddAuthentication( AzureADB2CDefaults.AuthenticationScheme )
        .AddAzureADB2C( options =>
        {
            Configuration.Bind( "AzureAdB2C", options );
        } );
4

4 回答 4

4

从 Web 应用程序传递到 Azure AD B2C 的身份验证请求可以包含两个重定向 URL:

  1. 在“redirect_uri”参数中传递的一个(通常称为回复 URL),必须向 Azure AD B2C 注册,所有身份验证响应都会从 Azure AD B2C 返回到您的 Web 应用程序。默认值为/signin-oidc.
  2. 另一个(通常称为返回 URL)在“状态”参数中往返,不必向 Azure AD B2C 注册,在您的 Web 应用程序处理身份验证响应后将最终用户返回到该参数. 这方面的一个例子是/Onboarding/Start

您的 Web 应用程序可以按如下方式设置返回 URL:

public class AccountController : Controller
{
    public IActionResult SignUp()
    {
        return this.Challenge(
            new AuthenticationProperties()
            {
                RedirectUri = Url.Action("Start", "Onboarding", values: null, protocol: Request.Scheme)
            },
            AzureADB2CDefaults.AuthenticationScheme);
    }
}

ChallengeResult对象为该AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2C方法添加的 Azure AD B2C 身份验证中间件创建身份验证质询。

构造函数的第一个参数ChallengeResult调用由 Azure AD B2C 身份验证中间件注册的 OpenID Connect 身份验证处理程序。

此构造函数的第二个参数设置在 Azure AD B2C 身份验证中间件处理身份验证响应后最终用户将返回到的返回 URL。

于 2018-06-16T01:25:10.543 回答
1

据我了解,您需要启用 Application Claim -> newUser。

此标志仅在用户最初注册时设置为 true。一旦他们被重定向回您的网站,如果他们是现有用户,您将需要阅读声明并重定向到您的入职/启动或其他控制器。

在此处输入图像描述

于 2018-06-15T15:04:24.770 回答
0
  1. 但我从未被重定向到预期/开始页面。相反,我回到了根主页,就像我使用“signin-oidc”时发生的情况一样。为什么会这样,我如何让它停止去那里?

  2. 我怎样才能让回复 URL 根据您是登录还是登录而有所不同?我真的不能对一个使用注册策略,对另一个使用单独的登录策略,因为回复 URL 是相同的。

我面临的问题与您的问题非常相似。你可以看看这个答案

它说

“CallbackPath 是服务器在身份验证期间重定向的路径。它由 OIDC 中间件本身自动处理,这意味着我们无法通过创建新的控制器/动作并将 CallbackPath 设置为它来控制逻辑。以下是一般过程:

在身份验证过程中,整个过程由 OpenID Connect 中间件控制,用户在 Azure 的登录页面验证凭据后,Azure Ad 会将用户重定向回 OIDC 配置中设置的应用程序重定向 url,以便您获取授权码(如果使用代码流)并完成认证过程。身份验证后,用户将被重定向到重定向 URL。”

在这里您可以找到一个示例,我如何在通过 AzureAd 登录后设法处理重定向到不同的路由。

于 2020-04-28T10:08:05.507 回答
0

您可以将 redirect_uri 更改为您网站中的任何操作,但问题是 uri 仅用作端点。uri 处的操作永远不会执行。所以我认为改变redirect_uri的路由是非常困难的,如果不是不可能的话。

但是我找到了另一种解决方案来确保执行您的入职注册,使用 Authorize 属性和以下策略:[Authorize(Policy="HasUserId")]

看看https://stackoverflow.com/a/57672145

于 2019-08-27T10:21:27.327 回答