IdentityServer4 Admin UI - PullRequest
       43

IdentityServer4 Admin UI

0 голосов
/ 14 января 2019

Я работаю над IdentityServer4.AdminUI, который разработан на github. GitHub IdentityServer4.AdminUI

Сначала я просто создал нового пользователя и установил его пароль, затем я создал новый ApiResource с именем Api_Name . Затем я создал IdentityResource с тем же именем Api_Name . Наконец, я создал нового клиента с именем Api_Client и установил для Разрешенных областей клиента значение Api_Name и Разрешенные типы предоставления на Пароль и, наконец, установил секрет клиента на секрет

Теперь я создал новый проект 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. Так почему я получил эту ошибку, так как использовал полученный токен доступа с сервера идентификации

1 Ответ

0 голосов
/ 15 января 2019

Вам также необходимо добавить запрошенную область в запрос на токен (даже если вы сказали, что клиенту разрешен доступ 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, вашему клиенту не был разрешен доступ к нему, потому что токена не хватило.

...