【问题标题】:Asp.Net Core Identity - Using a stored procedure to save new usersAsp.Net Core Identity - 使用存储过程保存新用户
【发布时间】:2018-07-14 16:42:01
【问题描述】:

我看到了很多关于 ASP.Net Core Identity 的信息,并且一直在拼凑如何自定义它,因为我正在构建一个用于针对现有 SQL Server 数据库的站点。

我已经能够为AspNetUsers 表定制我的替换,并让新用户正确保存。由于在使用此数据库的现有系统中,发生了几个存储过程调用,它们包含了很多功能,我想使用相同的方法。所以我认为不是这样的默认调用:

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

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

【问题讨论】:

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


    【解决方案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上的相关文档以获取更多信息。

    【讨论】:

    • 我今天会试试这个,我怀疑它会做我想做的事,结合@twinmind 的建议从 proc 中分离出实际插入,并执行你的两个建议上面,而不是或。
    【解决方案2】:

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

    【讨论】:

    • 这是有道理的,但下面@Metoule 的建议之类的东西难道不能保持原样吗?我认为我可以做到这一点,以便 proc 完成除插入之外的所有操作,并让 Identity / CreateAsync 处理它。我同意这与我最初的问题不同,但鉴于我在下面看到的内容和您的评论,我倾向于走这条路。
    • 是的,@Metoule 的方法看起来很可靠。我们还可以考虑将用户创建和过程调用包装到同一个事务中,以避免在用户创建期间数据损坏
    猜你喜欢
    • 2019-09-01
    • 2019-08-21
    • 2017-04-20
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 2015-09-11
    相关资源
    最近更新 更多