Identity Server 3 - отправленные данные для конечной точки токена не читаются - PullRequest
0 голосов
/ 20 ноября 2018

У меня странная проблема с приложением, которое я запускаю в производство.

Приложение представляет собой Asp.net 4.7.2 Webapi, защищенный встроенным экземпляром Identity Server 3, а также экземпляром swagger для документации.

Мне нужна только аутентификация клиента, поэтому я выбираю client credential в качестве потока.

Это основные данные конфигурации приложения.

new Client {
    ClientName = "GDPR Logger Client",
    Enabled = true,
    ClientId = "gdpr_logger",
    Flow = Flows.ClientCredentials,
    AccessTokenType = AccessTokenType.Reference,
    ClientSecrets = new List<Secret> {
        new Secret("secret".Sha256())
    },
    AllowedScopes = new List<string> {
        "write"
    },
    AccessTokenLifetime = 30
}

app.Map("/auth", auth => {
    var options = new IdentityServerOptions {
        SiteName = "GDPR LOGGER Authentication Server",
        SigningCertificate = LoadCertificate(),
        RequireSsl = true,
        Factory = new IdentityServerServiceFactory()
            .UseInMemoryUsers(new List<InMemoryUser>())
            .UseInMemoryClients(Clients.Get())
            .UseInMemoryScopes(Scopes.Get());
    };
    auth.UseIdentityServer(options);
});

private static X509Certificate2 LoadCertificate() {
    certificateFilePath = HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["RelativeCertPath"]);
    X509Certificate2 cert = new X509Certificate2();
    cert.Import(certificateFilePath, "GDPRLoggerCert",           X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
    return cert;}

На моей локальной машине все работаютидеально, но как только я положил его на свой сервер, Identity Server перестает работать.

Когда я пытаюсь получить токен доступа для клиента (с потоком client_credentials), Identity Server отвечает мне invalid_client, когда я POST до https://{my-server}/auth/connect/token все данные как application/x-www-form-urlencoded содержимое в запросе grant_type=client_credentials&client_id=gdpr_logger&client_secret=secret&scope=write.

2018-11-20 09:14:20,035 [244] INFO  IdentityServer3.Core.Endpoints.TokenEndpointController - Start token request
2018-11-20 09:14:20,066 [244] DEBUG IdentityServer3.Core.Validation.ClientSecretValidator - Start client validation
2018-11-20 09:14:20,066 [244] DEBUG IdentityServer3.Core.Validation.BasicAuthenticationSecretParser - Start parsing Basic Authentication secret
2018-11-20 09:14:20,082 [244] DEBUG IdentityServer3.Core.Validation.PostBodySecretParser - Start parsing for secret in post body
2018-11-20 09:14:20,082 [244] DEBUG IdentityServer3.Core.Validation.PostBodySecretParser - No secret in post body found
2018-11-20 09:14:20,082 [244] DEBUG IdentityServer3.Core.Validation.X509CertificateSecretParser - Start parsing for X.509 certificate
2018-11-20 09:14:20,082 [244] DEBUG IdentityServer3.Core.Validation.X509CertificateSecretParser - client_id is not found in post body
2018-11-20 09:14:20,082 [244] INFO  IdentityServer3.Core.Validation.SecretParser - Parser found no secret
2018-11-20 09:14:20,082 [244] INFO  IdentityServer3.Core.Validation.ClientSecretValidator - No client secret found
2018-11-20 09:14:20,082 [244] INFO  IdentityServer3.Core.Endpoints.TokenEndpointController - End token request
2018-11-20 09:14:20,097 [244] INFO  IdentityServer3.Core.Results.TokenErrorResult - Returning error: invalid_client

Если я укажу client_id и client_secret в качестве заголовка Basic Authentication, сервер идентификации будет отвечать мне unsupported_grant_type.

2018-11-20 09:08:36,113 [323] INFO  IdentityServer3.Core.Endpoints.TokenEndpointController - Start token request
2018-11-20 09:08:36,144 [323] DEBUG IdentityServer3.Core.Validation.ClientSecretValidator - Start client validation
2018-11-20 09:08:36,144 [323] DEBUG IdentityServer3.Core.Validation.BasicAuthenticationSecretParser - Start parsing Basic Authentication secret
2018-11-20 09:08:36,144 [323] DEBUG IdentityServer3.Core.Validation.SecretParser - Parser found secret: BasicAuthenticationSecretParser
2018-11-20 09:08:36,144 [323] INFO  IdentityServer3.Core.Validation.SecretParser - Secret id found: gdpr_logger
2018-11-20 09:08:36,160 [323] DEBUG IdentityServer3.Core.Validation.SecretValidator - Secret validator success: HashedSharedSecretValidator
2018-11-20 09:08:36,160 [323] INFO  IdentityServer3.Core.Validation.ClientSecretValidator - Client validation success
2018-11-20 09:08:36,176 [323] INFO  IdentityServer3.Core.Validation.TokenRequestValidator - Start token request validation
2018-11-20 09:08:36,363 [323] ERROR IdentityServer3.Core.Validation.TokenRequestValidator - Grant type is missing.
 {
  "ClientId": "gdpr_logger",
  "ClientName": "GDPR Logger Client",
  "Raw": {}
}
2018-11-20 09:08:36,363 [323] INFO  IdentityServer3.Core.Endpoints.TokenEndpointController - End token request
2018-11-20 09:08:36,379 [323] INFO  IdentityServer3.Core.Results.TokenErrorResult - Returning error: unsupported_grant_type

Как вы можете видеть в последнем журнале в Raw, кажется, что данные в посте не считываются / не принимаются с Identity Server.

Я не могу понять, что такоепроблема.

1 Ответ

0 голосов
/ 20 ноября 2018

Диспетчер моего сервера решил проблему.

ModSecurity (в Plesk внутри брандмауэра веб-приложений) для домена второго уровня, как в моем случае, заблокировал почтовые данные, потому что он снова выполняет свои правила.

Отключение или редактирование правил решило проблему.

...