【问题标题】:IdentityServer4 LocalApi with custom policy in .NET Core 3.1IdentityServer4 LocalApi 与 .NET Core 3.1 中的自定义策略
【发布时间】:2020-02-25 12:22:05
【问题描述】:

我正在尝试将 IdentityServer4 的“LocalApi”功能与一些自定义策略一起使用。

我有一个 API(托管在与 IdentityServer4 相同的应用程序实例上),它分为三个部分(服务器、管理器、产品)和三个客户端(服务器、管理器、产品)。客户端只能调用 API 的专用部分,我会使用基于范围的策略来执行此操作。

所以我有以下内容:

启动:

services.AddLocalApiAuthentication(); // Add API hosted on same application than IdentityServer
services.AddAuthorization(options =>
    {
        options.AddPolicy("Manager", policy =>
        {
            //policy.RequireClaim("scope", configuration.GetValue<string>("EchinoLoginApiManagerScopeOptions:Name"));
            policy.RequireClaim("scope", "local_api_manager_scope");
            policy.RequireClaim("scope", IdentityServerConstants.LocalApi.ScopeName);
        });

        options.AddPolicy("Server", policy =>
        {
            //policy.RequireClaim("scope", configuration.GetValue<string>("EchinoLoginApiServerScopeOptions:Name"));
            policy.RequireClaim("scope", "local_api_server_scope");
            policy.RequireClaim("scope", IdentityServerConstants.LocalApi.ScopeName);
        });

        options.AddPolicy("Product", policy =>
        {
            //policy.RequireClaim("scope", configuration.GetValue<string>("EchinoLoginApiProductScopeOptions:Name"));
            policy.RequireClaim("scope", "local_api_product_scope");
            policy.RequireClaim("scope", IdentityServerConstants.LocalApi.ScopeName);
        });
    });

还有我的 ApiResource

new ApiResource
     {
         Name = IdentityServerConstants.LocalApi.ScopeName,
         Scopes =
         {
             new Scope()
             {
                 Name = IdentityServerConstants.LocalApi.ScopeName,
                 DisplayName = IdentityServerConstants.LocalApi.ScopeName,
             },
             new Scope()
             {
                 Name = "local_api_product_scope",
                 DisplayName = echinoLoginApiProductScopeOptions.DisplayName,
                 UserClaims = echinoLoginApiProductScopeOptions.UserClaims
             },
             new Scope()
             {
                 Name = "local_api_manager_scope",
                 DisplayName = echinoLoginApiManagerScopeOptions.DisplayName,
                 UserClaims = echinoLoginApiManagerScopeOptions.UserClaims
             },
             new Scope()
             {
                 Name = "local_api_server_scope",
                 DisplayName = echinoLoginApiServerScopeOptions.DisplayName,
                 UserClaims = echinoLoginApiServerScopeOptions.UserClaims
             }
         }
     }

最后是我的服务器客户端

new Client
     {
         ClientId = echinoServerOptions.Id,
         ClientName = echinoServerOptions.Name,

         ClientSecrets =
         {
             new Secret(echinoServerOptions.Secret.Sha256())
         },

         AllowedGrantTypes = GrantTypes.ClientCredentials,
         //AllowedScopes = AddLocalApiScope(echinoServerOptions.AllowedScopes)
         AllowedScopes = { "IdentityServerApi", "server_scope", "local_api_server_scope" }
     },

所以在我的控制器中我使用 [Authorize(Policy = "Server")] 但我总是有一个身份验证失败。 如果我使用 [Authorize(LocalApi.PolicyName)] 它可以工作,但我没有自定义策略。

JWT 令牌的负载如下:

{
  "nbf": 1582632694,
  "exp": 1582636294,
  "iss": "https://localhost:44334",
  "aud": [
    "IdentityServerApi",
    "EchinoLoginApi"
  ],
  "client_id": "EchinoServer",
  "scope": [
    "IdentityServerApi",
    "local_api_server_scope",
    "server_scope"
  ]
}

我一定错过了什么,但我找不到什么。

谁能帮帮我?

【问题讨论】:

    标签: c# asp.net-core identityserver4


    【解决方案1】:

    对于本地 api,您应该将 [Authorize(LocalApi.PolicyName)] 与您的自定义策略一起使用。

    [Authorize("productpolicy")]
    [Authorize(LocalApi.PolicyName)]
    [ApiController]
    [Route("api/[controller]")]
    public class ProductController : ControllerBase
    {...
    

    或者你可以换一种方式处理:

    options.AddPolicy(ClientLocalScopes.AuthenticationAuthorization, policy =>
        {
            policy.AddAuthenticationSchemes(IdentityServerConstants.LocalApi.AuthenticationScheme);
            policy.RequireAuthenticatedUser();
    // write your code here
        });
    

    【讨论】:

    • 同时使用 [Authorize(Policy = "Server")][Authorize(LocalApi.PolicyName)] 可以解决问题,非常感谢
    猜你喜欢
    • 2020-05-22
    • 2020-04-06
    • 2021-05-02
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2018-06-25
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多