IdentityServer4 неавторизован, несмотря на предоставление действительного токена

#c# #asp.net-core #.net-core #oauth-2.0 #identityserver4

#c# #asp.net-core #.net-ядро #oauth-2.0 #identityserver4

Вопрос:

Я пытаюсь защитить api с помощью IdentityServer4.

Конфигурация запуска IdentityServer:

 public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients())
        .AddInMemoryApiScopes(Config.GetApiScopes());
}
 

Конфигурация:

 public class Config
{
    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("myAPI", "Test API")
        };
    }

    public static IEnumerable<Client> GetClients()
    {
        return new List<Client>
        {
            new Client
            {
                ClientId = "client",
                AllowedGrantTypes = GrantTypes.ClientCredentials,
                ClientSecrets =
                {
                    new Secret("secret".Sha256())
                },
                AllowedScopes = { "myAPI" }
            }
        };
    }

    public static IEnumerable<ApiScope> GetApiScopes()
    {
        return new List<ApiScope>
        {
            new ApiScope("myAPI", "Test API")
        };
    }
}
 

Когда я вызываю свой IdentityServer с запросом Post http://localhost:5000/connect/token , я получаю действительный токен, так что это должно сработать.

введите описание изображения здесь

Конфигурация запуска API:

 public void ConfigureServices(IServiceCollection services)
    {
       services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options => {
                options.Authority = "http://localhost:5000";
                options.Audience = "myAPI";
                options.RequireHttpsMetadata = false;
            });

        services.AddAuthorization();

        services.AddDbContext<ApiContext>(options => options.UseInMemoryDatabase("ApiDb"));
        services.AddMvc(options => options.EnableEndpointRouting = false).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
    }
 

Контроллер API имеет [Authorize] атрибут.

Я пытаюсь вызвать контроллер с помощью токена, который я получил от IdentityServer. К сожалению, я получаю 401 неавторизованный, несмотря на предоставление токена в качестве токена-носителя.

Что-то в моей конфигурации неправильно или почему я все еще получаю 401?

Заранее спасибо

— РЕДАКТИРОВАТЬ: полный Startup.cs API

 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.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options => {
                // base-address of your identityserver
                options.Authority = "http://localhost:5000";

                // if you are using API resources, you can specify the name here
                options.Audience = "myAPI";
                options.RequireHttpsMetadata = false;
            });

        services.AddAuthorization();

        services.AddDbContext<ApiContext>(options => options.UseInMemoryDatabase("ApiDb"));
        services.AddMvc(options => options.EnableEndpointRouting = false).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
    }

    // 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.UseAuthentication();
        app.UseMvc();
    }
}
 

Комментарии:

1. Когда вы получаете 401, вы видите соответствующую ошибку на сервере идентификации?

2. нет, я не вижу ошибки в окне консоли identityserver: (

3. можете ли вы показать свой полный startup.cs в веб-api

4. да, конечно, я добавил его в свой пост внизу

5. в вашем методе настройки добавьте app.UseAuthorization() внизу app.UseAuthentication