ASP. net core IdentityServer4 отвечает invalid_grant, когда я пытаюсь обновить sh мой токен доступа - PullRequest
1 голос
/ 22 марта 2020

У меня есть ASP. net основной проект IdentityServer4 со следующей конфигурацией:

Startup.cs:

    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddInMemoryIdentityResources(InMemoryConfiguration.IdentityResources())
                .AddTestUsers(InMemoryConfiguration.TestUsers().ToList())
                .AddInMemoryClients(InMemoryConfiguration.Clients())
                .AddInMemoryApiResources(InMemoryConfiguration.ApiResources());
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseIdentityServer();
        }
    }

InMemoryConfiguration. cs:

 public class InMemoryConfiguration
    {
        public static IEnumerable<ApiResource> ApiResources()
        {
            return new[]
            {
                new ApiResource("main", "main")
                {
                    UserClaims = new List<string>{ClaimTypes.Email}
                }, 
            };
        }

        public static IEnumerable<IdentityResource> IdentityResources()
        {
            return new IdentityResource[]
            {
                new IdentityResources.OpenId(),
                new IdentityResources.Profile(),
                new IdentityResources.Email(),
            };
        }

        public static IEnumerable<Client> Clients()
        {
            return new[]
            {
                new Client
                {
                    ClientId = "mainclient",
                    ClientSecrets = new[] {new Secret("secret".Sha256())},
                    AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
                    AllowedScopes = new[]
                    {
                        "main",
                        // IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        // IdentityServerConstants.StandardScopes.Email
                        IdentityServerConstants.StandardScopes.OfflineAccess
                    },
                    AllowOfflineAccess = true,
                    RefreshTokenUsage = TokenUsage.OneTimeOnly,
                    RefreshTokenExpiration = TokenExpiration.Sliding,
                },
                new Client
                {
                    ClientId = "apiclient",
                    ClientSecrets = new[] {new Secret("secret".Sha256())},
                    AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
                    AllowedScopes = new[] {"main",IdentityServerConstants.StandardScopes.OfflineAccess},
                }
            };
        }

        public static IEnumerable<TestUser> TestUsers()
        {
            return new[]
            {
                new TestUser
                {
                    SubjectId = "1",
                    Username = "jvanhoye@hotmail.com",
                    Password = "pass",
                    Claims = new List<Claim>{new Claim(ClaimTypes.Email,"jvanhoye@hotmail.com55")}
                }
            };
        }
    }

Затем я использую Почтальон для получения токена доступа: Экран Почтальона A

Но когда я пытаюсь обновить sh, используя его по ссылке sh токен из предыдущего запроса я получаю 'Invalid_grant': Экран почтальона B

Кто-нибудь, кто знает, что я делаю неправильно?

1 Ответ

0 голосов
/ 22 марта 2020

При просмотре исходного кода IdentityServer4, есть несколько интеграционных тестов, которые проверяют invalid_grant код возврата.

В обоих этих случаях это сообщение возвращается в случае

  1. предоставление неверного пароля
  2. пользователь заблокирован
  3. пользователь не разрешен.

Проверка выполняется внутри класса:

public class ResourceOwnerPasswordValidator<TUser> : IResourceOwnerPasswordValidator

Некоторую информацию также можно найти в файле журнала IdentityServer, он использует библиотеку Serilog, ведение журнала можно включить в программе .cs in Main метод сервера идентификации:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    .MinimumLevel.Override("System", LogEventLevel.Warning)
    .MinimumLevel.Override("Microsoft.AspNetCore.Authentication", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.File("logs\\some-file-name.txt")
    .CreateLogger();

BuildWebHost(args).Run();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...