将B2C回复URL从“signin-oidc”更改为其他内容无效。

6
我正在尝试在Azure AD B2C中运行一个ASP.NET Core 2.1 Web应用程序。通过研究文档并进行多次试验后,我已经成功实现了这一点,但是文档中的说明有些不准确。
在项目设置向导期间使用默认脚手架和新的Microsoft.AspNetCore.Authentication.AzureADB2C.UI Nuget,可以使登录/注册过程正常工作,并简化启动体验。
目前的问题是,我无法将自定义Reply URL与“signin-oidc”区分开来。据我所知,“signin-oidc”似乎已经被提供程序内置,因此成为了默认值。
我有一个OnboardingController,其中定义了一个Start操作,我希望用户在注册后能够着陆到该页面,因此我已经完成了以下操作:
  • A) 我测试了Url localhost:12345/Onboarding/Start,页面正确显示。
  • B) 在appsettings.json中,我将AzureAdB2C的"CallbackPath": "/signin-oidc"改为"CallbackPath": "/Onboarding/Start"appsettings
  • C) 我进入租户并将应用程序的Reply URL更改为localhost:12345/Onboarding/Start重要提示:与ADB2C示例和指南不同,您必须将Reply URL附加到signon-oidc或自定义请求路径!Localhost:12345不够!tenant config

    我可以确认身份验证已经成功: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler:Information: AuthenticationScheme: AzureADB2CCookie signed in. Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 56.201ms

当我手动在浏览器中导航到/Onboarding/Start时,我收到以下错误消息:

远程身份验证出错:关联失败。

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. 但我从未被重定向到预期的/Start页面。相反,我会回到根主页,就像使用“signin-oidc”时发生的情况一样。为什么会这样,我该如何停止它?

2. 如何让答复URL因登录或注册而异?我不能为一个使用注册策略,另一个使用单独的登录策略,因为答复URL是相同的。

我对.Net Core很陌生,不知道如何调试此问题。使用B2C登录似乎是一个晦涩的过程。任何见解都将不胜感激。

编辑: 这是自定义帐户控制器,它不包含在AzureADB2C的Nuget软件包中。 虽然Nuget软件包提供了一个内部AccountController,但它不允许您设置自定义Reply 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 );
        } );

请问您能否提供一些有关Azure AD B2C控制台中策略的详细信息。感兴趣的内容包括:
  1. 注册或登录策略
  2. 注册策略
  3. 登录策略
- Mr Slim
@MrSlim 目前我只有一个名为“B2C_1_susi”的SignSignUp策略。我是按照微软的B2C指南创建的,除了DisplayName和ObjectID之外没有其他声明。 - John
4个回答

4

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

  1. 一个(通常称为 “回复 URL”),该 URL 在“redirect_uri”参数中传递,必须在 Azure AD B2C 中进行注册,在其中,所有身份验证响应都从 Azure AD B2C 返回到您的 Web 应用程序。它的默认值是 /signin-oidc
  2. 另一个(通常称为 “返回 URL”),该 URL 在“state”参数中往返传递,不必在 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 对象创建一个身份验证挑战,为 Azure AD B2C 认证中间件提供支持,该中间件通过 AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2C 方法添加。 ChallengeResult 构造函数的第一个参数调用了由 Azure AD B2C 认证中间件注册的 OpenID Connect 身份验证处理程序。
该构造函数的第二个参数设置了用户在 Azure AD B2C 认证中间件处理身份验证响应后返回的返回 URL。

谢谢。我已经尝试了这种方法,但是除非我使用Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2C.Controllers.Internal中内置的AccountController,否则它不起作用。一旦我使用自己的AccountController,代码就会停止工作,而没有明显的错误消息。我还注意到Challenge是控制器基类中的一个内置方法。不确定那和使用new ChallengeResult()之间的区别是什么。两者都不起作用。我无法使用这种方法登录或注销。您知道可能是为什么吗?我已附带代码片段的问题 - John
嗨@John,我已经使用this.Challenge方法更新了上面的答案。如果您没有将AzureADB2CDefaults.AuthenticationScheme方案传递到此方法中,则可能无法正常工作。 - Chris Padgett
感谢Chris的帮助。你示例中的this.Challenge方法看起来与我所做的完全相同,唯一的区别是properties.Items[PolicyAuthenticationProperty] = azureAdB2COptions.SignUpSignInPolicyId。 - John

1

我理解您需要启用应用声明 -> newUser。

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

enter image description here


好的发现。谢谢@MrSlim,这将解决我问题的第二部分。我应该在哪里和如何钩入重定向以读取索赔?此外,您不会碰巧也看到我为什么会出现相关错误吗? - John

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

  2. 如何使答复URL因登录或注册而异?我无法为一个使用注册策略,另一个使用单独的登录策略,因为答复URL是相同的。

我曾经遇到过与您非常相似的问题。您可以查看this answer

其中提到:

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

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

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


0

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

但我找到了另一种解决方案,以确保执行您的Onboarding Registration,使用具有策略的Authorize属性,例如:[Authorize(Policy="HasUserId")]

看一下 https://dev59.com/qaTia4cB1Zd3GeqP-jtA#57672145


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接