[英]Adding external login with Identity Server 4 and ASP.NET Identity
[英]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)
我有另一种方法。
UserManager
和UserStore
是预构建/定义的类,具有非常特定的功能。 我不会尝试直接扩展它们-我一直在走这条路,而且很漂亮。
我建议创建一个新服务。 一个专门为您提供此信息的工具:
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.