如何在IdentityServer4中实现自己的ClientStore?

时间:2020-04-04 19:35:10

标签: c# entity-framework-core identityserver4

我想向IdentityServer4中的Client实体添加一些额外的列(例如 ClientCustomProperty ),并在我的业务层中处理它们,因此我要像这样创建自定义商店:

public class MyClientStore : IClientStore
{
    public Task<IdentityServer4.Models.Client> FindClientByIdAsync(string clientId)
    {
         // ...
    }
}

我想从商店中返回带有额外列(不是IdentityServer4.Models.Client)的自己的模型,但是IClientStore.FindClientByIdeAsync签名是:

Task<IdentityServer4.Models.Client> FindClientByIdAsync(string clientId);

我认为应该是这样的(通用):

Task<TModel> FindClientByIdAsync<TModel>(string clientId)
    where TModel: class, IClientModel /* IClientModel is in IS4 */

我需要做些什么才能获得自定义模型?

1 个答案:

答案 0 :(得分:1)

我评论中的建议是可能的解决方案。只要您为Client将有效的ClientFindClientByIdAsync()派生的对象返回给IS4,就可以针对客户存储所需的任何内容。


选项1:源自Client

public MyClient : Client
{
    public string MyExtraProperty { get; set; }
}

Task<Client> FindClientByIdAsync(string clientId)
{
   MyClient result = // fetch your client here;
   return result;
}

选项2:适应Client

public MyClient
{
    // Properties that Client requires, or can be adapted to what Client requires, here.
    // ...

    public string MyExtraProperty { get; set; }
}

Task<Client> FindClientByIdAsync(string clientId)
{
   MyClient result = // fetch your client here;
   return Adapt(result);
}

private Client Adapt(MyClient value)
{
    return // your-client-adapted-to-Client here;
}

由于Client已包含大量数据,因此此选项的意义不那么大。


选项3:添加到Properties

在这里,您将其他数据添加到Client.Properties集合中。 IS4会忽略它,但是您可以在Client实例可用的任何地方访问数据。此选项不需要自定义类型,甚至不需要自定义IClientStore;已经支持。