使用IdentityServer4从DB显式登录/注销自定义用户

使用IdentityServer4从DB显式登录/注销自定义用户,identityserver4,Identityserver4,我正在使用我的DB和ASP核心身份服务器进行身份验证。我还实现了IResourceOwnerPasswordValidator和IProfileService。 我通过tokenClient.RequestResourceOwnerPasswordAsync方法连接到服务器,不使用MVC 一切似乎都按预期工作,但我想将IsLoggedIn属性设置为我的用户,并将其保存在DB中,当会话结束时,将其设置为false 什么地方最好?到处都找不到答案 编辑 此外,我想提到的是,我使用IdentityMo

我正在使用我的DB和ASP核心身份服务器进行身份验证。我还实现了
IResourceOwnerPasswordValidator
IProfileService
。 我通过
tokenClient.RequestResourceOwnerPasswordAsync
方法连接到服务器,不使用MVC

一切似乎都按预期工作,但我想将IsLoggedIn属性设置为我的用户,并将其保存在DB中,当会话结束时,将其设置为false

什么地方最好?到处都找不到答案

编辑


此外,我想提到的是,我使用IdentityModel客户端库连接到IdentityServer,因此我没有rest api。每当请求令牌时,都会调用令牌端点。您可以使用ProfileService钩住流。您可以添加自己的版本:

public class ProfileService : IProfileService
{
    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        var sub = context.Subject.GetSubjectId();
        var user = await _userManager.FindByIdAsync(sub);
        var principal = await _claimsFactory.CreateAsync(user);

        var claims = principal.Claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList();

        // Add your code ...

        context.IssuedClaims = claims;
    }

    public async Task IsActiveAsync(IsActiveContext context)
    {
        var sub = context.Subject.GetSubjectId();
        var user = await _userManager.FindByIdAsync(sub);
        context.IsActive = user != null;
    }
}
请注意
上下文。调用方
。这表示使用的端点。对于访问令牌和刷新令牌,这应该是
ProfileDataCallers.ClaimsProviderAccessToken

不要忘记注册服务:

services.AddIdentityServer()
    ...
    .AddProfileService<ProfileService>();
同样,您可以在注销方法中更改状态


这只会确认用户何时需要新的访问令牌,而不会确认用户是否在此之后实际登录。大多数用户可能永远不会注销,而且cookie很可能会被销毁或过期

<>您可能想考虑将访问令牌设置为短的生命周期,比如5分钟,并考虑用户在5分钟后注销。由于访问令牌已过期,用户需要再次登录(或刷新访问令牌)


您可以将刷新令牌限制为仅一次使用。你也可以考虑使用:

使用引用令牌时-IdentityServer将存储内容 数据存储中的令牌,并且只会发出唯一标识符 将此令牌返回到客户端


如果我没有弄错的话,您可以将此限制为一个活动令牌。

这似乎是一个简单的问题,但范围相当广泛。在您的定义中,用户何时登录?你指的是哪节课?您是否将IdentityServer4与JWT令牌或引用令牌一起使用?@RuardvanElburg我认为当所有身份验证过程都成功提交时,用户已登录,但我不知道如何准确捕捉那个时刻。这是我的问题。实际上,我希望每个用户只有一个登录会话,并且在用户显式注销或超时之前不允许有多个登录。因此,当调用
GetProfileDataAsync
时,这意味着用户已经登录到服务器?我在哪里可以找到使用DB(EF核心)的引用令牌的示例?可能有使用ASP Identity+IdentityServer 4的示例?是的,访问UserInfo端点需要访问令牌。您可以使用来自的样本。设置令牌类型:
client.AccessTokenType=AccessTokenType.Reference
并向API添加一个秘密,如下所述:
await HttpContext.SignInAsync(user.Id, user.UserName, props);