我进行了大约一个星期的重新搜索,但没有找到解决我问题的方法。
我正在使用.NET Core 2 Api上的ASP.NET Core身份和身份服务器4来从Angular 4客户端应用中对用户进行身份验证。
我的问题是:
是否有任何解决方案可以仅在用户满足数据库中的某些值时(例如/connect/token
为1(真),等等)从EmailConfirmed
端点向用户提供令牌。
如果我不太清楚,请在下面留下评论。
答案 0 :(得分:1)
您可以使用IProfileService
作为扩展点。
IdentityServer4.AspNetIdentity
软件包已经提供了一个ProfileService<TUser>
(请参阅source)类,可以使用所需的行为对其进行扩展。
您可以在其中重写IsActiveAsync
方法并添加所需的逻辑。
public class ConfirmedUsersProfileService : ProfileService<TUser>
{
public override async Task IsActiveAsync(IsActiveContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
context.IsActive = user != null && user.EmailConfirmed == true;
}
}
当用户不存在于数据库中或未确认其电子邮件时,将不会登录,因此不会返回任何令牌。
在官方Identity4 Docs中也对此进行了明确说明。
IsActiveAsync
期望用于指示当前是否允许用户获取令牌的API。它传递了
IsActiveContext
的实例。
然后注册新的ConfirmedUsersProfileService
而不是旧服务:
services.AddIdentityServer()
...
.AddProfileService<ConfirmedUsersProfileService>();
还可以以某种方式在身份服务器级别上进行SQL查询吗?
是的,您可以将任何服务注入ConfirmedUsersProfileService
,即IdentityDbContext<TUser>
或UserManager<TUser>
(已经注入,您只需要在派生类中保留对它的引用即可) ,因为ProfileService<TUser>
中的字段被标记为私有。),然后对其执行任何查询。
PS 。IProfileService
可以并且也应该用作令牌扩展点。您也可以在此时从令牌中添加其他(或删除现有)声明。