使用 Ping Federate 通过现有 SSO 向 Web Api 验证 Angular 应用程序

Authenticate Angular Application to Web Api with Existing SSO using Ping Federate

我们有一个现有的 SSO 应用程序,它有一个登录表单,可以对 ping federate 进行身份验证。

我正在尝试将相同的 SSO 机制与 angular cli 11 一起使用。

我已经到了从 Pingfederate 返回开放令牌的地步。我想做的不是我们设置我的 ASP.NET 核心应用程序来接受这个令牌,验证它,并授予我访问其中声明的权限。

在较旧的 MVC 应用程序中,此令牌是使用 opentoken 库解密的,其中看起来只是一个密码。

如何配置我的 .net core 3.1 应用程序来接受和验证这个开放令牌?

这是我目前的情况:

services.AddAuthentication()
            .AddOAuth("urn:ietf:params:oauth:grant-type:saml2-bearer", opt =>
            {
                opt.ClientId = Configuration["PingOpenToken:ClientId"];
                opt.ClientSecret = Configuration["PingOpenToken:ClientSecret"];
            });

其中客户端密码与我们用来解密令牌的密码相同。我不知道 Client Id 值应该是什么。

urn:ietf:params:oauth:grant-type:saml2-bearer 来自 This ping documentation

我假设我将把我在授权 header 中拥有的开放令牌放置为 bearer {token}

为了验证我的 pingfederate 配置并查看是否需要打开其他任何东西,在我的协议设置下,我有:

如果我需要打开 oAuth 2.0,我会不知道如何配置它。

在与 PingFederate 的几个人通话后,我想出了如何配置和使用 PF oauth,而不是利用他们的 opentoken 实现。

要点是用户被发送到 SSO,当他们返回到我的 angular 应用程序时,他们用令牌点击了 url。然后,我使用令牌对 PF 进行 API 回调以获取他们的 oauth 令牌。

然后在我的 API 中,我有一个 Azure 广告服务主体和 PF 的双重配置,如下所示:

services.AddAuthentication()
            .AddJwtBearer(ApiConstants.AuthenticationSchemes.AzureBearerToken, opt =>
            {
                opt.Audience = Configuration["AzureAd:ResourceId"];
                opt.Authority = $"{Configuration["AzureAd:Instance"]}{Configuration["AzureAd:TenantId"]}";
                opt.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = false
                };
            })
            .AddJwtBearer(ApiConstants.AuthenticationSchemes.PingBearerToken, opt =>
            {
                opt.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["PingFederate:JwtIssuer"],
                    ValidAudience = Configuration["PingFederate:JwtAudience"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["PingFederate:JwtSymmetricKey"]))
                };
            });

        services.AddAuthorization(options =>
        {
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .AddAuthenticationSchemes(ApiConstants.AuthenticationSchemes.PingBearerToken, 
                    ApiConstants.AuthenticationSchemes.AzureBearerToken)
                .Build();
        });

我的两个常量值是“azure”和“ping”。