在联合身份验证后获取用户声明,并将其包含在请求 JWT 中

本文关键字:包含 请求 JWT 声明 身份验证 用户 获取 | 更新日期: 2023-09-27 17:55:25

我有一个基于 Owin 的 Web 应用程序和一个后端 Web API,它们针对 AAD 进行身份验证,工作流可以描述如下所列。

  • Web 应用使用联合身份验证针对 AAD 对最终用户进行身份验证。
  • Web
  • 应用从 AAD 请求 JWT 以访问后端 Web API。

用于对最终用户进行身份验证的主代码。

    public void ConfigureAuth(IAppBuilder app)
    {
        // other code...
        app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
        {
            Wtrealm = realm,
            MetadataAddress = adfsMetadata
        });
    }

获取 JWT 以访问后端 API 的主要代码:

    internal async Task<string> GetAccessToken()
    {
        var authContext = new AuthenticationContext(authority);
        var credential = new ClientCredential(clientId, appKey);

        var result = await authContext.AcquireTokenAsync(apiId, credential);
        // Here, what I wanted is to use the other overloaded method
        // authContext.AcquireTokenAsync(apiId, credential, userAssertion);
        // But to instantiate a UserAssertion instance, the only way is 
        // to use the constructor new UserAssertion(assertionString)
        // and the assertionString should be in JWT format
        // unfortunately, the assertionString from Ws-Federation auth is
        // for sure in SAML2 format. So, the question is: 
        // Give I am using Ws-Federation auth protocal, How can I pass the
        // user information in requesting a JWT to backend API resource?
        return result.AccessToken;
    }

通常,整个身份验证工作流都可以,我既可以对最终用户进行身份验证,也可以获取 JWT 以访问支持的 API。但问题是 JWT 中没有最终用户声明。我确定我应该从联合身份验证结果中获取用户声明,然后将他们置于请求 JWT 的过程中。不幸的是,对于所有方法、库和类,我都没有找到解决方案来做到这一点。

顺便说一句,https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect 给出了一个示例,如何获取包含最终用户声明的 JWT,但该解决方案不适用于我的方案,因为我使用的是联合身份验证而不是 OpenID Connect。

编辑

为了明确问题:在 Web 应用程序中,我想请求一个 JWT 令牌,以使用方法 AuthenticationContext.AcquireTokenAsync 访问后端 Web api。

从我的演示代码中,您可以看到我正在使用AcquireTokenAsync(apiId, clientCredential)重载版本。但此版本不会在内部附加最终用户声明。实际上我需要的是AcquireTokenAsync(apiId, clientCredential, userAssertion)重载方法。

但是,要实例化UserAssertion,我需要用户断言字符串,这是用户身份验证结果的AccessToken。不幸的是,UserAssertion类只接受 JWT 格式断言字符串,但 Ws 联合身份验证返回 SAML2 格式断言字符串,因此我无法实例化UserAssertion实例。

所以,我的问题是:鉴于我使用 Ws 联合身份验证协议对最终用户进行身份验证,在后端如何将用户断言信息(采用 SAML2 格式)传递给 AAD 以请求后端 API 资源的 JWT?

在联合身份验证后获取用户声明,并将其包含在请求 JWT 中

AAD 提供"预制"声明。没有向令牌添加其他属性的声明规则。

参考:支持的令牌和声明类型。

如果需要其他属性,则需要使用图形 API。