IdentityServer4 管理界面

Posted

技术标签:

【中文标题】IdentityServer4 管理界面【英文标题】:IdentityServer4 Admin UI 【发布时间】:2019-06-08 12:31:10 【问题描述】:

我正在研究在 github 上开发的 IdentityServer4.AdminUI GitHub IdentityServer4.AdminUI

首先我简单地创建了一个新用户并设置了密码,然后我创建了名为 Api_Name 的新 ApiResource。然后我创建了具有相同名称 Api_Name 的 IdentityResource。最后,我创建了名为 Api_Client 的新客户端,并将客户端允许的范围设置为 Api_Name,将允许的授权类型设置为 Password,最后将客户端密码设置为 秘密

现在,我创建了新的 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();
    

确定我在 WebApi 控制器中使用了 [Authorize] 属性

最后是测试。 我创建了控制台应用程序并使用此代码

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 返回 UnAuthorized 401。所以为什么我收到这个错误,因为我使用了从身份服务器接收到的访问令牌

【问题讨论】:

response..的返回结果呢?? 响应从 api 返回值,但未授权。我说它是为了确保一切正常 您是否尝试将用户添加到角色并授予对该角色的 API 访问权限... 【参考方案1】:

您还需要在令牌请求中添加请求的范围(即使您说允许客户端访问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 不同,在 IDS3 中您将获得客户端允许的所有范围。因此,就您的 Api 身份验证中间件而言,由于令牌不足,因此不允许您的客户端访问它。

【讨论】:

没错,这就是错过的。我应该为我的 ApiResource 添加一个范围,并在客户端中授予对该范围的访问权限。

以上是关于IdentityServer4 管理界面的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL远程连接配置管理/账号密码分配(解决:致命错误: 用户 "postgres" Ident 认证失败)

通过 Azure API 管理生成访问令牌并针对 IdentityServer4 进行验证

结合IdentityServer4配置Ocelot的Json配置文件管理更新

学习 skoruba/ IdentityServer4.Admin 完整版

UserManager<TUser>管理用户,如何修改identity默认hash加密算法

一步一步学习IdentityServer4 处理特殊需求之-登录等待页面