仅当用户满足某些条件时,才向身份服务器4提供令牌

时间:2018-06-20 07:18:55

标签: asp.net-core identityserver4

我进行了大约一个星期的重新搜索,但没有找到解决我问题的方法。

我正在使用.NET Core 2 Api上的ASP.NET Core身份和身份服务器4来从Angular 4客户端应用中对用户进行身份验证。

我的问题是: 是否有任何解决方案可以仅在用户满足数据库中的某些值时(例如/connect/token为1(真),等等)从EmailConfirmed端点向用户提供令牌。

如果我不太清楚,请在下面留下评论。

1 个答案:

答案 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可以并且也应该用作令牌扩展点。您也可以在此时从令牌中添加其他(或删除现有)声明。