Asp.Net核心身份 - 使用存储过程来保存新用户

时间:2018-02-04 19:30:31

标签: asp.net-mvc asp.net-core asp.net-identity entity-framework-core

我看到很多关于ASP.Net核心身份的信息,并且一直在拼凑如何定制它,因为我正在构建一个用于对付现有SQL Server数据库的站点。

我已经能够自定义AspNetUsers表的替代品,并且可以正确保存新用户。由于在使用此数据库的现有系统中存在一些包含大量功能的存储过程调用,我想使用相同的方法。所以我认为不是像这样的默认调用:

var result = await _userManager.CreateAsync(user, model.Password);

我需要一些可以调用一个或多个存储过程来创建用户的东西。我应该继承UserManager并覆盖CreateAsync来电吗?如果是这样,我可以使用现有的用户存储吗? WRT身份,我看起来有点模糊。谢谢!

2 个答案:

答案 0 :(得分:1)

我会考虑保持身份函数调用,并分别添加特定于应用程序的调用。 CreateAsync做了很多好事,比如密码哈希,时间戳和用户名/电子邮件规范化。此功能是Identity产品的实际有价值的部分,重写它只会引入安全漏洞,并且需要大量时间用于应用程序开发。身份不仅仅是SQL表,还包括管理身份验证工作流的所有逻辑,以及实施的安全最佳实践。

答案 1 :(得分:1)

您应该继续使用_userManager.CreateAsync,但要使用自己的UserStore实现方式对其进行配置。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddIdentity<MyUser>()
        .AddUserStore<MyUserStore>();
}

然后,创建一个自定义UserStore,您可以在其中调用您的上下文类(包括对存储过程的调用):

public class MyUserStore : IUserStore<MyUser>
{
    private MyContext _db;
    public MyUserStore(MyContext db)
    {
        _db = db;
    }

    public async Task<IdentityResult> CreateAsync(MyUser user, CancellationToken cancellationToken)
    {
        // simply store entity in DB
        user = _db.Users.Add(user).Entity;
        await _db.SaveChangesAsync();

        // or run stored procedure
        await _db.Database.ExecuteSqlCommandAsync("usp_MyUserCreationStoredProcedure @p0, @p1", user.FirstName, user.LastName);

        return IdentityResult.Success;
    }
}

您可以查看how to create custom user stores上的相关文档以获取更多信息。