c# - ASP.Net Identity 2 使用短信密码登录 - 不使用双因素身份验证

标签 c# asp.net asp.net-web-api asp.net-identity asp.net-identity-2

在 @Taiseer Joudeh ( http://bitoftech.net/2015/01/21/asp-net-identity-2-with-asp-net-web-api-2-accounts-management/ ) 的博客系列之后,我使用 JWT 身份验证构建了简单的 WebApi。我可以使用 token 登录并查询我的端点。

我正在尝试更改我的登录机制的工作方式。
现在,用户必须将其登录名和密码发送到 /oauth/token 才能获取访问 token ,该 token 将随每个向 webapi 的请求一起发送。

我希望能够使用密码登录用户,该密码将通过短信发送到分配给他帐户的电话号码。

它应该需要两个请求来标记端点路径。第一个只有用户 ID(登录名或某个唯一标识符),然后端点应检查用户是否存在,如果存在则应通过短信发送密码。
然后用户将在我的表单中输入该密码,第二个请求将使用用户 ID 和密码对 token 端点路径进行。

我已阅读有关双因素身份验证的内容(http://bitoftech.net/2014/10/15/two-factor-authentication-asp-net-web-api-angularjs-google-authenticator/ 和其他来源),但它要求用户使用用户名和密码登录,然后通过短信提交第二个密码。

就我而言,我希望用户仅传递用户名和短信密码。

编辑: 下面是我尝试构建的代码,它是起点,但我不知道如何完成它的实现。我已经覆盖了 OAuthAuthorizationServerProvider

中的 GrantCustomExtension
public override async Task GrantCustomExtension(OAuthGrantCustomExtensionContext context)
{
    const string allowedOrigin = "*";
    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });

    //custom grant_type
    if (context.GrantType != "sms")
    {
        context.SetError("invalid_grant", "unsupported grant_type");
        return;
    }

    var userName = context.Parameters.Get("username");
    if (userName == null)
    {
        context.SetError("invalid_grant", "username is required");
        return;
    }

    var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
    ApplicationUser user = await userManager.FindByNameAsync(userName);
    if (user == null)
    {
        context.SetError("invalid_grant", "user not found");
        return;
    }

    //generate one-time password
    //store it in database
    //send it to user phone number
    //return ok message

    context.Validated();

    //return base.GrantCustomExtension(context);
}

这是 Startup.cs 的一部分,负责设置 oAuthAuthorizationServer:

public void ConfigureOAuthTokenGeneration(IAppBuilder app)
{
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

    var issuer = ConfigurationManager.AppSettings["Issuer"];

    OAuthAuthorizationServerOptions oAuthServerOptions = new OAuthAuthorizationServerOptions()
    {
        #if DEBUG
        AllowInsecureHttp = true,
        #endif
        TokenEndpointPath = new PathString("/oauth/token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(1),
        Provider = new CustomOAuthProvider(),
        AccessTokenFormat = new CustomJwtFormat(issuer)
    };

    // OAuth 2.0 Bearer Access Token Generation
    app.UseOAuthAuthorizationServer(oAuthServerOptions);

}

我能够发送自定义 grant_type 并在数据库中查找用户,但最难的部分仍然缺失。我知道我可以将一次性密码存储在 User 表中,但也许 ASP.Net Identity 2 具有内置机制,我不想重新发明轮子。

最佳答案

您可以通过每次更改用户密码来实现。

不知道您的情况是否被接受

如果您对此解决方案感兴趣,请按照以下步骤操作:

用户管理器

    ApplicationUserManager _userManager;

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

// get your user here
var currentUser = UserManager.Users...
            if (currentUser != null)
            {
                var resultRemove = UserManager.RemovePassword(currentUser.Id);
                var resultAdd = UserManager.AddPassword(currentUser.Id, model.NewPassword);
                if (resultAdd.Succeeded && resultRemove.Succeeded)
                    //Send SMS here
            }

关于c# - ASP.Net Identity 2 使用短信密码登录 - 不使用双因素身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36642938/

相关文章:

c# - 具有动态枚举字段的自定义 Unity C# 脚本编辑器

c# - 使用动态内容创建局部 View

azure - 从 Azure Web API 获取未经授权

c# - ASP.NET MVC4 Web API Controller 卡在一条路线上

c# - 你能建议一个正则表达式来捕获这段文字吗?

C# : Whether this approach is thread-safe

c# - 在 if 语句中返回

asp.net - 如何实现 zopfli 以获得更好的 gzip 压缩?

c# - 在 asp.net mvc c# 中将钱格式化为货币

c# - 静态变量如何在 Web session 中共享