#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