在联合身份验证后获取用户声明,并将其包含在请求 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?
AAD 提供"预制"声明。没有向令牌添加其他属性的声明规则。
参考:支持的令牌和声明类型。
如果需要其他属性,则需要使用图形 API。