【问题标题】:How to get Client Info inside API Method for Identity Server 4如何在 Identity Server 4 的 API 方法中获取客户端信息
【发布时间】:2023-01-03 17:25:19
【问题描述】:

我在身份服务器 4 中有一个项目,我在中间件应用程序中有一个创建方法,所以我想根据客户端调用 API 设置一些默认值(可能是客户端名称)

场景,我们有一个用于注册用户的 API 端点,将由多个客户端使用单独的客户端 ID 和客户端名称(如“MobileAPP”、“网站”和“CRMAPP”)调用

我想根据调用“注册用户”API 的客户端添加一些默认值。

可以提出建议或线索以实现这一目标。

我试图读取请求上下文,但没有找到任何内容。我找到了一种方法来记录基于客户端定义的here 但不是我们的 API 方法中的客户端信息。

客户定义:

new Client
            {
                ClientName = "Test Mobile App",
                ClientId = "test_mobile_app",
                AllowedGrantTypes = GrantTypes.ClientCredentials,
                ClientSecrets =
                    {
                        new Secret("mykey".Sha256())
                    },
                AllowedScopes =
                    {
                        "app.openid",
                        "app.profile",
                        "user.manage"
                    },
                AllowOfflineAccess = true,
                RefreshTokenUsage = TokenUsage.ReUse,
                AccessTokenLifetime = 3600,
                RefreshTokenExpiration = TokenExpiration.Absolute,
                AbsoluteRefreshTokenLifetime = 2592000
            }

政策:

 option.AddPolicy("MobileAppScope", policy =>
            {
                policy.RequireAuthenticatedUser();
                policy.RequireClaim("scope", "user.manage")
                .RequireClaim("scope", "app.openid")
                .RequireClaim("scope", "app.profile");

            });

授权属性:

 [Authorize(Policy = "MobileAppScope", AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

【问题讨论】:

    标签: c# api .net-core identityserver4


    【解决方案1】:

    当用户从特定客户端登录时,您可以 add claims 以便您可以添加另一个包含 clientId 的声明:

     public virtual Task GetProfileDataAsync(ProfileDataRequestContext context)
     {
        var requestedClaimTypes = context.RequestedClaimTypes;
        var user = context.Subject;
    
        // your implementation to retrieve the requested information
        var claims = GetRequestedClaims(user, requestedClaimsTypes);
        //Here add a claim for ClientId
        claims.Add(new Claim("ClientId", context.Client.ClientId));
        context.IssuedClaims.AddRange(claims);
    
        return Task.CompletedTask;
     }
    

    当用户尚未通过身份验证时,您可以解码 jwt 令牌并在 API 方法的主体中获取客户端 ID,如下所示:

    var token=(new JwtSecurityTokenHandler()).ReadJwtToken([tokenFromHeader]);
    

    【讨论】:

    • 用户登录后可以使用声明,但在我的场景中,我们正在注册并且没有人登录。只是应用程序正在使用使用客户端 ID 和客户端密码创建的授权令牌进行调用
    • 默认情况下,当用户未登录时,不存在授权令牌。您是否有任何身份验证机制来调用该 Api 端点?如果答案是肯定的,那么把它放在这里看看我们是否能够将它用于此目的。如果答案是否定的,在 Identity Server 中找到端点的调用者与其他端点没有区别。您可以只依赖于 IP 等一般属性。
    • 是的,我有基于策略的授权机制。客户端应用程序将首先调用 Identity Server 端点 (/connect/token) 以获取令牌,该令牌将用于授权调用 API
    • 我在上面添加了我正在使用的客户端定义示例。
    • 所以你在 Api 的请求标头中有 jwt 令牌,对吗?
    猜你喜欢
    • 2018-12-21
    • 2020-03-22
    • 2012-11-28
    • 2020-03-22
    • 2019-07-25
    • 2020-01-11
    • 2016-04-12
    • 2018-12-04
    • 2020-12-07
    相关资源
    最近更新 更多