繁体   English   中英

向asp.net身份登录添加方法

[英]Adding method to asp.net identity login

使用asp.net身份,我在IdentityUser表中添加了一个名为isActive的列,该列将isActive一点,它将检查用户是否应该能够登录。在登录控制器中,我添加了:

if (!await UserManager.IsUserActiveAsync(user.UserId))
{
    return View("AccountDisabled");
}

我还向UserStore类添加了以下方法:

public Task<TUser> IsUserActiveAsync(Guid userId)
        {
            using (var connection = new SqlConnection(_connection))
            {
                var param = new DynamicParameters();
                param.Add("@UserId", userId);
                var result = connection.Query<TUser>("IdentityCheckUserIsActive", param, commandType: CommandType.StoredProcedure).SingleOrDefault();

                return Task.FromResult(result);
            }
        }

但是我收到以下错误: 'IdentityUserManager' does not contain a definition for 'IsUserActiveAsync' and no extension method 'IsUserActiveAsync' accepting a first argument of type 'IdentityUserManager' could be found (are you missing a using directive or an assembly reference?)

我不知道那是什么意思

您可以创建如下扩展方法:

public static class UserManagerExtensions 
{
    public static Task<TUser> IsUserActiveAsync(this UserManager mgr, Guid userId, string _connection)
    {
        using (var connection = new SqlConnection(_connection))
        {
            var param = new DynamicParameters();
            param.Add("@UserId", userId);
            var result = connection.Query<TUser>("IdentityCheckUserIsActive", param, commandType: CommandType.StoredProcedure).SingleOrDefault();

            return Task.FromResult(result);
        }
    }
}

似乎您正在尝试访问不带实例的UserManager方法,因此可以这样创建它的实例:

UserManager userManager = new UserManager(/*Params here if needed*/);

那么您只需致电:

if (!await userManager.IsUserActiveAsync(user.UserId))
{
    return View("AccountDisabled");
}

但是,如果您希望能够在不实例化对象的情况下从类中调用该方法,则需要将该方法标记为静态,即

public static Task<TUser> IsUserActiveAsync(Guid userId)

我有另一种方法。

UserManagerUserStore是预构建/定义的类,具有非常特定的功能。 我不会尝试直接扩展它们-我一直在走这条路,而且很漂亮。

我建议创建一个新服务。 一个专门为您提供此信息的工具:

public interface IActiveUserService
{
    Task<bool> IsUserActiveAsync(Guid userId);
}

public class ActiveUserService : IActiveUserService
{
    private readonly DbContext context;

    // I generally have DI inject a factory and I use that to create my DbContext instance (this is the prefered method)
    // for simplicity I have just pass DbContext
    // if you stick with this, 
    // you should make sure this service is constructed per request
    public ActiveUserService(DbContext context)
    {
        this.context = context;
    }

    public async Task<bool> IsUserActiveAsync(Guid userId) 
    {
         var connection = this.dbContext.Database.Connection   ;

         // I assume from this you are using Dapper??
         var param = new DynamicParameters();
         param.Add("@UserId", userId);
         var result = await connection
                               .Query<TUser>(
                                   "IdentityCheckUserIsActive", 
                                   param, 
                                   commandType: CommandType.StoredProcedure)
                               .SingleOrDefaultAsync();

         return result.IsActive;
    }
}

在您的消费类中:

if (!await this.activeUserService.IsUserActiveAsync(user.UserId))
{
    return View("AccountDisabled");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM