我的应用程序使用Asp.Net Identity并在登录上向我的Auth应用程序发送双因素代码。这是非常标准的(因为网上有很多例子)并使用SendCode()方法。我的理解是“神奇”是由这条线完成的:
// Generate the token and send it
if (!await SignInManager.SendTwoFactorCodeAsync(model.SelectedProvider))
{
View("Error");
}
我的要求是确保用户在他们想要在登录后更改密码时经历2FA的相同过程。
我的问题是,当执行发送2FA代码的代码时:
if (!await SignInManager.SendTwoFactorCodeAsync(model.SelectedProvider))
{
View("Error");
}
我收到错误'找不到用户ID':
Server Error in '/MSPortal' Application.
UserId not found.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: UserId not found.
Source Error:
Line 555:
Line 556: // Generate the token and send it
Line 557: if (!await SignInManager.SendTwoFactorCodeAsync(model.SelectedProvider))
Line 558: {
Line 559: return View("Error");
我知道SendTwoFactorCodeAsync()调用GetVerifiedUserIdAsync(),但我的理解是现在已经验证用户已经使用2FA登录。
有谁知道为什么我会收到这个错误?
感谢。
答案 0 :(得分:0)
我通过在IdentityConfig.cs中覆盖SendTwoFactorCodeAsync()解决了这个问题。在这个覆盖中,我首先按照惯例调用GetVerifiedUserIdAsync(),但如果是0则从Current HttpContext获取用户ID。
我并不是说这是最好的方式,但它是我迄今为止所做的,它让我继续前进,我的目标是让2FA登录,更改密码和忘记密码。
代码(如果得到反馈,可能会进行一些重构)是:
public override async Task<bool> SendTwoFactorCodeAsync(string provider)
{
int userId = 0;
try
{
userId = await GetVerifiedUserIdAsync();
if (userId == 0)
{
userId = Convert.ToInt32(HttpContext.Current.User.Identity.GetUserId());
}
if (userId == 0)
return false;
}
catch
{
return false;
}
var token = await UserManager.GenerateTwoFactorTokenAsync(userId, provider);
// See IdentityConfig.cs to plug in Email/SMS services to actually send the code
await UserManager.NotifyTwoFactorTokenAsync(userId, provider, token);
return true;
//return base.SendTwoFactorCodeAsync(provider);
}