在项目设置向导期间使用默认脚手架和新的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"
C) 我进入租户并将应用程序的Reply URL更改为
localhost:12345/Onboarding/Start
。重要提示:与ADB2C示例和指南不同,您必须将Reply URL附加到signon-oidc或自定义请求路径!Localhost:12345不够!我可以确认身份验证已经成功: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler:Information: AuthenticationScheme: AzureADB2CCookie signed in. Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 56.201ms
远程身份验证出错:关联失败。
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 );
} );