Identity Server 4 создать клиент с IConfiguration - PullRequest
0 голосов
/ 26 июня 2018

Я сохранил свои клиенты для моего сервера идентификации в файле appsettings.json:

"ClientSettings":  [
{
  "ClientId": "TestClient1",
  "RedirectUris": [ "http://localhost:5002/signin-oidc" ],
  "PostLogoutRedirectUris": [ "http://localhost:5002/signout-callback-oidc" ],
  "AllowedGrantTypes": [ "hybrid" ],
  "AllowedScopes": [ "openid","profile","email" ],
  "RequireConsent": "false",
  "Enabled": "true",
  "ClientSecrets": [
    {
      "Description": "This is the client sceret description.",
      "Value": "password123"
    }
  ]
}
],

В моем методе ConfigureServices я настроил внедрение зависимости

services.Configure<List<Client>>(config.GetSection("ClientSettings"));

My IClientStore получает список клиентов с помощью внедрения зависимостей.Конечно, мне нужно хешировать секрет клиента.Чтобы не усложнять этот вопрос, я написал этот код, в котором предполагается, что у меня есть только один клиент с одним клиентским секретом.

public ClientConfigFileStore(IOptions<List<Client>> options)
{
    var jsonClient = options.Value[0];
    Client client = new Client()
    {
        ClientId = jsonClient.ClientId,
        RedirectUris = jsonClient.RedirectUris,
        PostLogoutRedirectUris = jsonClient.PostLogoutRedirectUris,
        AllowedGrantTypes = jsonClient.AllowedGrantTypes,
        AllowedScopes = jsonClient.AllowedScopes,
        RequireConsent = jsonClient.RequireConsent,
        Enabled = jsonClient.Enabled,
    };//Works
    Client client = jsonClient;//Does not work

    client.ClientSecrets = new List<Secret>()
    {
        new Secret(jsonClient.ClientSecrets.First().Value.Sha256())
    };
    clients = new List<Client>() { client };
}

Каким-то образом мне нужно создать новый экземпляр Client и использовать его.созданный путем внедрения зависимости не работает.После того, как пользователь вводит свои учетные данные на сервере идентификации, перенаправление на клиент завершается с помощью Client secret validation failed for the client: TestClient1

Почему необходимо создать новый экземпляр и существует ли более элегантный способ загрузки клиентов из appsettings.jsonфайл

Ответы [ 2 ]

0 голосов
/ 12 июля 2018

Измените секретную часть вашего клиента на это:

"ClientSecrets": [
      {
        "Value": "<Sha256 hash of secret>",
        "Type": "SharedSecret"
      }
 ],
0 голосов
/ 26 июня 2018

Я не совсем уверен, что понимаю, что вы пытаетесь сделать или почему вы пытаетесь сделать это так.Главным образом я не уверен, почему вы хотите загрузить их в DI, как вы.Вы должны изучить использование в памяти клиентов.

startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        // configure identity server with in-memory stores, keys, clients and scopes
        services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryClients(Config.GetClients());
    }

config.cs

public class Config
{
    // scopes define the API resources in your system
    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("api1", "My API")
        };
    }

    // clients want to access resources (aka scopes)
    public static IEnumerable<Client> GetClients()
    {
        // client credentials client
        return new List<Client>
        {
            new Client
            {
                ClientId = "client",
                AllowedGrantTypes = GrantTypes.ClientCredentials,

                ClientSecrets = 
                {
                    new Secret("secret".Sha256())
                },
                AllowedScopes = { "api1" }
            }
        };
    }
}

Код из быстрый запуск сервера идентификации

...