.net身份自定义身份验证

时间:2018-04-16 21:25:05

标签: asp.net asp.net-mvc authentication asp.net-web-api identity

我有一个Web API,由Web应用程序和移动应用程序使用。目前它使用用户名和密码登录的标准方法。为简单起见,我们需要通过SMS向用户发送六位数代码;此代码与电话号码相结合将授予他们访问API的权限。

我的问题: 是否可以生成一个六位数字,让用户使用此代码和电话号码的组合登录?

我正在考虑将其添加到请求标头然后在身份验证提供程序中处理它的可能性,但我不确定是否有最佳实践我应该遵循此处。当然,安全性非常重要。

我可以检查提供程序中的标头,然后让代码相应地执行操作。我搜索了其他的例子,但没有找到任何东西,所以这更像是一个指导和最佳方法的问题。代码将有一天到期并在散列后存储在数据库中。

同样,任何建议都会受到最高的赞赏。

2 个答案:

答案 0 :(得分:0)

您需要Set up SMS for Two-factor authentication使用ASP.NET Identity并创建一个实现接口IIdentityMessageService

的类
public class SmsService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        // Send SMS implementation using SMS provider 
    }
}

然后Enable two-factor authentication让用户强制输入生成六位数字以完成登录过程。

答案 1 :(得分:0)

因此,我的解决方案是使用自定义授权类型。在OAuthProvider中,您可以覆盖GrantCustomExtension函数。你可以在下面看到我如何处理这个问题。

public override async Task GrantCustomExtension(OAuthGrantCustomExtensionContext context)
    {
        ApplicationUser currentUser = null;
        try
        {
            //custom grant_type
            if (context.GrantType != "sms")
            {
                context.SetError("invalid_grant", "unsupported grant_type");
                return;
            }

            var accessCode = context.Parameters.Get("access_code");
            var phoneNumber = context.Parameters.Get("phone_number");

            if (string.IsNullOrEmpty(accessCode))
            {
                context.SetError("invalid_grant", "Pin Code is required");
                return;
            }

            if (string.IsNullOrEmpty(phoneNumber))
            {
                context.SetError("invalid_grant", "Phone number is required");
                return;
            }

            // Do your authentication logic here.
        }
        catch (Exception ex)
        {
            context.SetError("invalid_grant", "Something went wrong. Please contact tech support.");
        }
    }

在这个问题的帮助下我达到了这一点。 ASP.Net Identity 2 - custom response from OAuthAuthorizationServerProvider

您可以使用此方法实现自己的授权类型和身份验证逻辑。对于我自己,我有一个四位数的代码哈希并存储在数据库中。当用户使用grant类型sms登录时,我将访问代码与数据库中的值进行比较,然后相应地执行操作。至于短信方面并发送令牌,我使用AWS简单通知服务。由于代码和短信是通过按钮点击发送的,因此实现起来很简单。希望这会有所帮助。