我正在使用带有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)负责从数据库中获取属性.