gpt4 book ai didi

c# - 使用经过验证的 JWT 进行图形身份验证

转载 作者:行者123 更新时间:2023-12-03 01:47:08 24 4
gpt4 key购买 nike

我们的 Azure 订阅中有一个应用程序注册,需要访问 Graph,在“所需权限”部分下进行设置。

Delegated Permissions image

我们的 Angular 应用程序正在启动针对 AAD 的身份验证,接收 JWT,将其附加到 header 中的所有请求并将其发送到我们的 WebApi,并在其中成功验证......太棒了!

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IjlGWERw...

现在,我还想从 WebApi 向 Graph 发出请求,并考虑到我拥有经过验证的 token ,我将通过授权 header 将其传递给 Graph REST API。

request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", jwtToken);

但是,我收到 401(未经授权)结果。为什么?显然我遗漏了一 block 拼图,但我不知道是什么。

我假设通过在 Azure 应用程序注册中设置 Graph 权限,当它将 token 发送到我们的 Angular 应用程序时,它对于 AAD 和 Graph 都有效......但情况似乎并非如此。

我的 JWT 如下所示。请注意,“aud”仅显示我的应用程序注册 ID,而不显示图表(如果这是问题,我该如何解决它?)

{
"aud": "<application id here>",
"iss": "https://sts.windows.net/<tenant id here>/",
"iat": 1499121655,
"nbf": 1499121655,
"exp": 1499125555,
"aio": "ASQA2/8DAAAACuKzzzni2uaVoaIb9yJa4j3XuG0O+9cQQQlnqXl8Sr0=",
"amr": [
"pwd",
"mfa"
],
"family_name": "Smith",
"given_name": "John",
"name": "John Smith",
"nonce": "<nonce here>",
"platf": "3",
"pwd_exp": "941678",
"sub": "<sub here>",
"tid": "<tenant id here>",
"unique_name": "jsm<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c2abb6aa82b1afabb6aabbeca1adaf" rel="noreferrer noopener nofollow">[email protected]</a>",
"upn": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4228312f2b362a02312f2b362a3b6c212d2f" rel="noreferrer noopener nofollow">[email protected]</a>",
"ver": "1.0"
}

编辑

我现在已经实现了 Nan Yu 描述的代表代码,但我仍然收到 401。前端 token 正在 WebAPI 中进行验证,然后创建对 Graph 的请求。

string authString = ConfigurationManager.AppSettings["ida:Authority"];
string clientId = ConfigurationManager.AppSettings["ida:Audience"];
string clientSecret = ConfigurationManager.AppSettings["ida:AppSecret"];
string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
string graphResourceId = ConfigurationManager.AppSettings["ida:GraphResourceId"];

AuthenticationContext authenticationContext = new AuthenticationContext(authString);
ClientCredential clientCred = new ClientCredential(clientId, clientSecret);

var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext;
string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
string userAccessToken = bootstrapContext.Token;
UserAssertion userAssertion = new UserAssertion(bootstrapContext.Token, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);

string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
string userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;

AuthenticationResult result = await authenticationContext.AcquireTokenAsync(graphResourceId, clientCred, userAssertion);

这工作正常,因为返回的 token 现在具有登录用户的图形“aud”和“scp”:

"aud": "https://graph.windows.net",
"scp": "User.Read User.ReadBasic.All",
"unique_name": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a9c3dac4c0ddc1e9dac4c0ddc1d087cac6c4" rel="noreferrer noopener nofollow">[email protected]</a>",
"upn": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7a100917130e123a0917130e120354191517" rel="noreferrer noopener nofollow">[email protected]</a>",

为什么我在尝试调用 /me Graph API 时仍然未经授权?

最佳答案

如果要调用 microsoft graph api ,您需要获取 microsoft graph api 的访问 token ,即aud (观众)访问 token 声明中应为 https://graph.microsoft.com

在您的场景中,如果用户登录客户端应用程序,然后客户端应用程序调用您的Web api,在Web api中,您想调用microsoft graph api,有两种方法可以实现:

1.使用 OAuth 2.0 代表流程委托(delegate)用户身份并向第二层 Web API 进行身份验证。请参阅代码示例 here .

2.使用 OAuth 2.0 客户端凭据授予,Azure AD 对 Web api 应用程序进行身份验证,并返回用于调用 Microsoft 图形的 JWT 访问 token 。在这种情况下,您应该在 Web api 应用程序中授予 microsft graph 权限。请参阅代码示例 here .

请点击here有关上述场景的更多详细信息。

关于c# - 使用经过验证的 JWT 进行图形身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44912419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com