Я работаю над IdentityServer4.AdminUI, который разработан на github GitHub IdentityServer4.AdminUI
Сначала я просто создал нового пользователя и установил ему пароль, затем я создал новый ApiResource с именем Api_Name. Затем я создал IdentityResource с тем же именем Api_Name. Наконец, я создал нового клиента с именем Api_Client и установил для клиента Allowed Scopes значение Api_Name, а Allowed Grant Types - Пароль и, наконец, установил секрет клиента на секрет.
Теперь я создал новый проект WebApi (Core 2.1) и использую его в классе запуска.
public void ConfigureServices(IServiceCollection services) {
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddMvcCore().AddAuthorization().AddJsonFormatters();
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options => {
options.Authority = "http://localhost:5000"; //Identity Server URL
options.RequireHttpsMetadata = false; // make it false since we are not using https
options.ApiName = "Api_Name"; //api name which should be registered in IdentityServer
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
else {
app.UseHsts();
}
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseMvc();
}
и конечно я использовал атрибут [Authorize] в контроллере WebApi
Наконец, тест. Я создал консольное приложение и использую этот код
var identityServer = await DiscoveryClient.GetAsync("http://localhost:5000"); //discover the IdentityServer
if (identityServer.IsError) {
Console.Write(identityServer.Error);
return;
}
HttpClient client = new HttpClient();
var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest {
Address = identityServer.TokenEndpoint,
ClientId = "Api_Client",
ClientSecret = "secret",
UserName = "Majd",
Password = "P@ssw0rd@123"
});
if (tokenResponse.IsError) {
Console.WriteLine(tokenResponse.Error);
return;
}
//Call the API
client.SetBearerToken(tokenResponse.AccessToken);
var response = await client.GetAsync("https://localhost:44368/api/values");
var response2 = await client.GetAsync("https://localhost:44368/api/values/1");
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(JArray.Parse(content));
Console.ReadKey();
Проблема в том, что response2 return UnAuthorized 401. Итак, почему я получил эту ошибку, поскольку я использовал полученный токен доступа с сервера идентификации
Ответ возвращает значение из API, но не авторизовано. Я поставил это для уверенности, что все в порядке
Вы пытались добавить пользователя в роль и предоставить доступ к этой роли API ...





Вам также необходимо добавить запрошенную область в ваш запрос токена (даже если вы сказали, что клиенту разрешен доступ к Api_Name).
var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest {
Address = identityServer.TokenEndpoint,
ClientId = "Api_Client",
ClientSecret = "secret",
UserName = "Majd",
Password = "P@ssw0rd@123",
Scope = "Api_Name"
});
В IDS4 токены выдаются только для запрошенных областей, в отличие от IDS3, где вы получите все области, разрешенные клиенту. Что касается вашего промежуточного программного обеспечения для аутентификации Api, вашему клиенту не разрешили получить к нему доступ, потому что токена не хватило.
Именно этого и не хватает. Я должен добавить область для моего ApiResource и предоставить доступ к этой области в клиенте.
как насчет возврата результата ответа .. ??