ICustomAuthorizeRequestValidator не вызывается?

Я пытаюсь использовать метод AddCustomAuthorizeRequestValidator для проверки пользовательских утверждений. Я даже не могу получить точку останова в реализации ICustomAuthorizeRequestValidator. Я что-то упустил? Моя точка останова

Код метода ConfigureServices:

services.AddMvc();

services.AddOptions();

services.AddTransient<ICustomAuthorizeRequestValidator, Saml2BearerValidator>();

services.AddIdentityServer()
    .AddTestUsers(Config.GetUsers())
    .AddConfigurationStore(builder =>
        builder.UseSqlServer(_settings.Value.ConnectionString, options =>
                options.MigrationsAssembly(migrationsAssembly)))
    .AddOperationalStore(builder =>
        builder.UseSqlServer(_settings.Value.ConnectionString, options =>
                options.MigrationsAssembly(migrationsAssembly)))
    .AddCustomAuthorizeRequestValidator<Saml2BearerValidator>()
    .AddSigningCredential(CertificateManager.GetFromStorage(
                _settings.Value.ServerCertificateThumb, _settings.Value.ServerCertificatePass));

    return services.ConfigureAutofacServicesProvider(_settings.Value.Abc_xacml_n3_diagnostic);

Ответ 1

В зависимости от того, как IdentityServer структурирует вещи, возможно ли, что это связано с тем, куда вы добавляете этот вызов?

Если IdentityServer создает конвейер промежуточного программного обеспечения непосредственно из того, что вы добавляете, возможно, он будет обработан до того, как достигнет этой точки в конвейере.

Любопытно, повезло ли вам решить эту проблему.

Ответ 2

Я посмотрел на репозиторий GitHub IdentityServer4. В своем классе DefaultCustomAuthorizeRequestValidator (который реализует ICustomAuthorizeRequestValidator) ValidateAsync оформлен следующим образом:

public Task ValidateAsync(CustomAuthorizeRequestValidationContext context)

Но со скриншота вы делаете:

public async Task ValidateAsync(CustomAuthorizeRequestValidationContext context)

Может быть, попробовать удалить ключевое слово async?

Надеюсь, это поможет: D

Ответ 3

У меня такая же проблема. Вместо этого я создал пользовательский грант. Создайте класс CustomValidationGrant, который реализует: IExtensionGrantValidator where TUser : IdentityUser, new(), есть параметр GrantType, для этого экземпляра я могу назвать его "custom" в startUp.cs добавить services.AddIdentityServer() .AddExtensionGrantValidator<CustomValidationGrant >()

Не забудьте разрешить grantType для вашего клиента.

В консольном приложении вы можете использовать что-то вроде этого:

var discoveryClient = new DiscoveryClient("http://localhost:5000");
discoveryClient.Policy.RequireHttps = false;

var doc = await discoveryClient.GetAsync();

var parameters = new Dictionary<string, string>();

parameters.Add("scope", "MyScope");

parameters.Add("client_secret", "SomeSecret");

parameters.Add("UserName", "UserName");

parameters.Add("Password", "Password");


var tokenResponse = await client.RequestTokenAsync(new TokenRequest
{
       Address = tokenEndpoint,
       ClientId = "your client",
       GrantType = "custom",
       Parameters = parameters
});