IdentityServer3 - Проверка сертификата клиента - PullRequest
0 голосов
/ 05 мая 2018

У меня есть IdentityServer3, и я пытаюсь запустить их исходные образцы WebHost (minimal) в качестве сервера и Console Client Credentials Flow using Certificate в качестве клиента, потому что я хочу проверить, что клиент может проверить IdS3, используя отпечаток пальца X509 вместо общего секрет для получения токена доступа.

Проблема в том, что я получаю сообщение об ошибке: invalid_client. По-видимому, это потому, что IdS3 не получает сертификат при входящем запросе, поэтому считает, что запрос токена недействителен (я проверил это, добавив пользовательский SecretParser и проверив параметр environment, а значение ssl.ClientCertificate отсутствует который X509CertificateSecretParser использует для его анализа).

Я просто запускаю оба проекта в двух разных экземплярах Visual Studio в IIS Express, не внося никаких изменений в проекты. Есть ли что-то, что мне не хватает по этому вопросу? Что еще мне нужно настроить, чтобы эта работа работала?

1 Ответ

0 голосов
/ 30 мая 2018

Первое, что вам нужно сделать, это включить клиентские сертификаты в IIS Express.

Вы делаете это, редактируя этот файл:

.vs \ Config \ ApplicationHost.config

Изменение

<access sslFlags="None" />

до

<access sslFlags="Ssl, SslNegotiateCert" />

Теперь IIS Express поддерживает клиентские сертификаты, но также проверяет, является ли сертификат доверенным.

Образец сертификата Client.pfx не будет работать из коробки.

Вы можете либо позволить Windows доверять издателю этого сертификата (не рекомендуется), либо вы можете загрузить существующий сертификат из хранилища сертификатов с помощью следующего кода:

        X509Store store = new X509Store(StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);
        string thumb = "<thumbprint>";
        X509Certificate2Collection cers = store.Certificates.Find(X509FindType.FindByThumbprint, thumb, false);
        X509Certificate2 cert = null;
        if (cers.Count > 0)
        {
            cert = cers[0];
        }
        store.Close();

Вам также необходимо поместить отпечаток этого сертификата в свойство ClientSecret в списке клиентов на Identity Server.

Это пример кода, который вам нужно изменить: новый клиент { ClientName = "Клиент потока учетных данных клиента", Включено = true, ClientId = "clientcredentials.client", Flow = Flows.ClientCredentials,

                ClientSecrets = new List<Secret>
                    {
                        new Secret("secret".Sha256()),
                        new Secret
                        {
                            Value = "<your thumbprint here>",
                            Type = Constants.SecretTypes.X509CertificateThumbprint,
                            Description = "Client Certificate"
                        },
                    },

                AllowedScopes = new List<string>
                    {
                        "read",
                        "write"
                    },

                Claims = new List<Claim>
                    {
                        new Claim("location", "datacenter")
                    }
            },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...