Двухфакторная аутентификация в Web API с токен-аутентификацией - PullRequest
0 голосов
/ 05 апреля 2019

Я создаю 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);
    }
...