在将联邦登录链接到预先创建的本地帐户的示例中。如果用户不存在,则抛出异常。
重定向到https://<host>/MicrosoftIdentity/Account/Error
在我看来,就是这一页
在这个阶段,我假设有两种可能:
- 自定义错误页面(以某种方式);或
- 更改自定义策略,使其不会抛出异常,而是显示自断言页面(防止
SendClaims
)
关于选项1,我试图找到关于如何捕获错误或自定义此页面的文档-但到目前为止我还没有找到任何东西。在asp.net core中有关于创建自定义错误页面的文档-但它似乎不适用于这种情况:
if (app.Environment.IsDevelopment())
{
//app.UseDeveloperExceptionPage();
app.UseExceptionHandler("/Error");
}
关于选项2,我尝试更改AAD-FindB2CUserWithAADOid
技术配置文件,使RaiseErrorIfClaimsPrincipalDoesNotExist
为假:
<TechnicalProfile Id="AAD-FindB2CUserWithAADOid">
<Metadata>
<Item Key="Operation">Read</Item>
<Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">false</Item>
<Item Key="UserMessageIfClaimsPrincipalDoesNotExist">An account could not be found for the provided user ID.</Item>
</Metadata>
<IncludeInSso>false</IncludeInSso>
<InputClaims>
<InputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="signInNames.oidToLink" Required="true" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="objectId"/>
<OutputClaim ClaimTypeReferenceId="extension_requiresMigrationBool"/>
<!-- account flagged for linking -->
</OutputClaims>
<IncludeTechnicalProfile ReferenceId="AAD-Common" />
</TechnicalProfile>
但是这导致了一个真正的异常——api调用变成了畸形。我不确定为什么会这样。
对于这种特殊情况,我想显示一条访问拒绝消息。但是,如果我可以为任何帐户错误创建一个样式化的页面,那就太好了。
两种策略都可以吗?我错过什么了吗?
我已经向我的Program.cs
介绍了以下内容:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp( options => {
builder.Configuration.GetSection( "AzureB2C" ).Bind( options );
options.Events = new OpenIdConnectEvents
{
OnRemoteFailure = context =>
{
if (context.Failure?.Message.ToUpper().Contains("AADB2C99002") == true)
{
context.Response.Redirect("/account-access");
context.HandleResponse();
return Task.FromResult(0);
}
return Task.CompletedTask;
}
};
});
在没有找到用户的情况下(在我的情况下,他们还没有被预先创建),那么他们将显示&;Access denied &;页面。这意味着其他错误将一如既往地出现。
我仍然不确定这是否是一个可以接受的解决方案。