Я создаю API авторизации и хотел бы использовать токен-аутентификацию и двухфакторную аутентификацию. Я могу отправить SMS с кодом безопасности, но я не уверен, как обрабатывать логику в GrantResourceOwnerCredentials. Я изначально настроил токен аутентификации, затем добавил двухфакторную логику. Проблема в том, что я не хочу устанавливать аутентификацию пользователя до тех пор, пока он не проверит код. Как мне изменить GrantResourceOwnerCredentials (и действие AccountController VerifyCode?) Для этого? Или я полностью не в курсе?
public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new [] {"*"});
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
var user = context.OwinContext.Get<ApplicationDbContext>().Users
.FirstOrDefault(u => u.UserName == context.UserName);
if (!userManager.CheckPassword(user, context.Password))
{
context.SetError("invalid_grant", "The user name or password is incorrect");
context.Rejected();
return Task.FromResult<object>(null);
}
var twoFactorEnabled = userManager.GetTwoFactorEnabled(user.Id);
if (twoFactorEnabled)
{
var code = userManager.GenerateTwoFactorToken(user.Id, "PhoneCode");
var notificationResult = userManager.NotifyTwoFactorToken(user.Id, "PhoneCode", code);
if (!notificationResult.Succeeded)
{
context.SetError("invalid_grant", "Two factor notification failed");
context.Rejected();
return Task.FromResult<object>(null);
}
}
var ticket = new AuthenticationTicket(SetClaimsIdentity(context, user), new AuthenticationProperties());
context.Validated(ticket);
return Task.FromResult<object>(null);
}