identityserver4 – 带有EntityFramework的IdentityServer 4 – 获取客户端属性?

我正在使用带有EntityFramework的Identity Server 4进行配置.我现在想从登录页面获取当前客户端.我能够从return url参数中获取客户端ID.然后我使用ConfigurationDbContext从数据库中获取客户端.

但是在客户端上,即使我在数据库中的该客户端上添加了属性,Properties属性也始终为null.

如何获取客户的属性?

最佳答案 而不是直接使用ConfigurationDbContext,IdentityServer项目中有一个更抽象的方便接口:即
IClientStore.此接口本身包含单个函数:
FindClientByIdAsync,可用于获取
Client.客户端包含许多属性,包括:

> ClientName
> LogoUri
>属性

您可以使用DI获取IClientStore的实例(我希望您已经为ConfigurationDbContext执行此操作).完成后,只需相应地调用FindClientByIdAsync:

var yourClient = await clientStore.FindClientByIdAsync(clientId);

使用此方法时,将按预期填充“属性”.

为了解释为什么你的原始方法没有给出预期的结果,我们需要理解实体框架核心如何处理loading related data.简单地说,当检索Client实体时(这是我上面使用的不同的Client类),默认情况下不会填充导航属性(例如“属性”),这就是您看到null的原因.如果您对此工作原理更感兴趣,我强烈建议您阅读Loading Related Data文档.

IClientStore(ClientStore)的实体框架核心实现为您处理此相关数据的加载.这是源代码本身的代码片段:

public Task<Client> FindClientByIdAsync(string clientId)
{
    var client = _context.Clients
        // ...
        .Include(x => x.Properties)
        .FirstOrDefault(x => x.ClientId == clientId);

    var model = client?.ToModel();

    return Task.FromResult(model);
}

Include(x => x.Properties)负责从数据库中获取属性.

点赞