.NET Core 上的 Okta 如何按用户组筛选?

How can we screen by user groups from Okta on .NET Core?

我正在为 Web 应用程序使用 ASP.NET 核心 MVC,并使用策略来筛选页面。当我创建需求时,我能够找到 OpenID Connect 附带的所有常规声明(名称、ver、iss、aud、iat 等),但找不到组,即使我已经在 OpenID 中添加了组Okta 中的连接令牌配置。

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{        
    services.AddAuthorization(options => {
        options.AddPolicy("ActionPrivilegeRequired", policy => policy.Requirements.Add(new ActionPrivilegeRequirement()));
    });
}

ActionPrivilegeRequirement.cs:

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ActionPrivilegeRequirement requirement)
    {
        var groupMembership = context.User.FindFirst(
            c => c.Type == "groups").Value;

        // ...
        return Task.CompletedTask;
    }

我需要做什么才能将 Okta 用户的组成员身份添加到用户对象的声明中?


更新:

我更新了 OpenId 中间件以在范围内包含组:

            OpenIdConnectOptions opts = new OpenIdConnectOptions()
            {
                //...
            };
            opts.Scope.Clear();
            opts.Scope.Add("openid");
            opts.Scope.Add("profile");
            opts.Scope.Add("groups");

并确认服务器请求 [Okta 端点]/oauth2/v1/token 和客户端请求 /authorize 包括组,但仍未在声明中找到组。

如果您还没有这样做 - 您是否添加了 groups scope to the /authorize 请求?看起来您已经在 Okta 管理端配置了组,但还需要从客户端请求它。

如果您请求群组范围,还有一些其他事项需要调查:

  1. 你有超过 100 个组要返回吗? scope dependent claims 文档底部有一条注释谈到了这个限制。

  2. 如果您验证您正在使用组范围发出请求,但它仍然无法正常工作 - 您能否检查从 Okta 返回的 id_token 并验证它是否包含团体与否?如果是这样,那么这可能是 .NET sdk 中的错误(我们可以为此打开一个问题)。

由于 cookie 膨胀,FYI 2.0 不再添加来自用户信息端点的所有内容。为了让群组出现在我的声明中,我将其添加到 AddOpenIdConnect 选项中...

options.ClaimActions.Add(new CustomJsonClaimAction(ClaimTypes.Role, ClaimTypes.Role, (x) => string.Join(",", x["groups"].Values<string>())));