将B2C回复URL从“signin-oidc”更改为其他内容不起作用

问题描述 投票:1回答:2

我正在尝试使用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" appsettings
  • C)我转到租户并将应用程序的回复URL更改为localhost:12345/Onboarding/Start。重要注意事项:与ADB2C样本和指南不同,您必须使用signon-oidc或自定义请求路径附加回复URL! Localhost:12345还不够! tenant config 我可以确认身份验证有效:Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler:信息:AuthenticationScheme:AzureADB2CCookie已登录.Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求在56.201ms完成

然后,当我在浏览器中手动导航到/ 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..

但我从未被重定向到意图/开始页面。相反,我回到根主页,就像我使用'signin-oidc'时发生的那样。为什么这样,我怎么让它停止去那里?

2.如何根据您是否登录IN或UP来更改回复URL?我无法真正为另一个使用注册策略和另一个单独的登录策略,因为回复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 );
        } );
c# azure-ad-b2c asp.net-core-2.1
2个回答
3
投票

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

  1. 在“redirect_uri”参数中传递的一个(通常称为回复URL),该参数必须在Azure AD B2C中注册,所有身份验证响应都从Azure AD B2C返回到您的Web应用程序。这个的默认值是/signin-oidc
  2. 另一个(通常称为返回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对象为由AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2C方法添加的Azure AD B2C身份验证中间件创建身份验证质询。

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

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


0
投票

我的理解是,您需要启用Application Claim - > newUser。

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.