问题
我正在尝试处理我的应用程序中的“重置密码”用户流程。单击“忘记密码”链接后,将成功触发OnRemoteFailure OpenId事件,成功将其重定向到指定的URL“ Home / ResetPassword”,但是或者重定向到ADB2C重置密码屏幕,它将重定向回登录/登录上一页。
背景
注册/登录策略可以成功运行,但按照Microsoft文档:https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-reference-policies:
“使用本地帐户进行注册或登录的用户流在体验的第一页上包含“忘记密码?”链接。单击此链接不会自动触发密码重置用户流。
而是,错误代码AADB2C90118返回到您的应用程序。您的应用程序需要通过运行重置密码的特定用户流来处理此错误代码。要查看示例,请看一个简单的ASP.NET示例,该示例演示用户流的链接。 ”
Active Directory B2C设置
用户流
码
OpenIdEvent
protected virtual Task OnRemoteFailure(RemoteFailureContext context)
{
context.HandleResponse();
// Handle the error code that Azure AD B2C throws when trying to reset a password from the login page
// because password reset is not supported by a "sign-up or sign-in policy"
if (context.Failure is OpenIdConnectProtocolException && context.Failure.Message.Contains("AADB2C90118"))
{
// If the user clicked the reset password link, redirect to the reset password route
context.Response.Redirect("/Home/ResetPassword");
}
else if (context.Failure is OpenIdConnectProtocolException && context.Failure.Message.Contains("access_denied"))
{
context.Response.Redirect("/");
}
else
{
context.Response.Redirect("/Home/Error?message=" + WebUtility.UrlEncode(context.Failure.Message));
}
return Task.FromResult(0);
}
家庭控制器
public IActionResult ResetPassword()
{
var redirectUrl = Url.Action(nameof(HomeController.Index), "Home");
var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
properties.Items[AzureADB2COptionsExtended.PolicyAuthenticationProperty] = _adb2cOptions.ResetPasswordPolicyId;
return Challenge(properties, AzureADB2CDefaults.AuthenticationScheme);
}
我发现很多示例都使用OWIN ... ASP.Net Core 2.2 w / ADB2C上的文档非常有限。
解决了
对于其他有相同或相似问题的人,请务必注意OpenIdConnectEvents。我们一直在试验ADB2C / OpenID,并提供了测试代码。此代码显然无效。
解
protected virtual Task OnRedirectToIdentityProvider(RedirectContext context)
{
string policy = "";
context.Properties.Items.TryGetValue(AzureADB2COptionsExtended.PolicyAuthenticationProperty, out policy);
if (!string.IsNullOrEmpty(policy) && !policy.ToLower().Equals(_adb2cOptions.DefaultPolicy.ToLower()))
{
context.ProtocolMessage.Scope = OpenIdConnectScope.OpenId;
context.ProtocolMessage.ResponseType = OpenIdConnectResponseType.IdToken;
context.ProtocolMessage.IssuerAddress = context.ProtocolMessage.IssuerAddress.ToLower().Replace(_adb2cOptions.DefaultPolicy.ToLower(), policy.ToLower());
}
return Task.FromResult(0);
}
最佳答案
这是complete sample供您参考。它在我这边工作正常。您可以下载该示例并检查代码。