azure 使用图形API获取用户信息

vmjh9lq9  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(183)

当我尝试通过访问令牌获取用户信息时,出现以下错误。我的Angular应用程序具有以下流(调用Web API的Web API)
Angular 应用程序--〉传递授权代码--〉API(生成访问令牌)---〉图形API(用户api)
出现一个或多个错误。(OnBehalfOfCredential身份验证失败:AADSTS50013:Assert签名验证失败。[原因-找到密钥,但使用密钥验证签名失败。,客户端使用的密钥指纹:“F8 A23743 D9 CD 47 B6 D1 A1 FXXXXXXA 17 A9 B1 D919 EC”,找到密钥“开始时间= 2022年10月2日18:06:49,结束时间= 2027年10月2日18:06:49”]。跟踪ID:1d 326676-f8 a5 -4410-b4 cf-SSS 1a 9 b64800相关性识别码:79 ca 8aec-bb 73 - 48 f9-b 0 d2-XXXb 4226 e625时间戳:2023年3月10日10时22分27秒)
应用程序在Azure中具有以下范围

"openid", "profile", "User.Read.All"
var tenantId= "tenantid";
                var clientId= "clientid";
                var clientSecret = "secret";

                // using Azure.Identity;
                var options = new OnBehalfOfCredentialOptions
                {
                    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
                };

                // This is the incoming token to exchange using on-behalf-of flow
                var oboToken = accessToken;

                var onBehalfOfCredential = new OnBehalfOfCredential(tenantId, clientId, clientSecret, oboToken, options);
                
                GraphServiceClient graphClient = new GraphServiceClient(onBehalfOfCredential, scopes);
                
                var result = graphClient.Users.GetAsync((requestConfiguration) =>
                {
                    requestConfiguration.QueryParameters.Count = true;
                    requestConfiguration.QueryParameters.Search = "\"displayName:rock\"";
                    requestConfiguration.QueryParameters.Orderby = new string[] { "displayName" };
                    requestConfiguration.QueryParameters.Select = new string[] { "id", "displayName", "mail" };
                    requestConfiguration.Headers.Add("ConsistencyLevel", "eventual");

                }).Result;
31moq8wy

31moq8wy1#

我尝试通过Postman在我的环境中重现相同的错误,但得到了如下相同的错误:

如果在生成访问令牌时传递无效Assert,则通常会发生此错误。

  • 检查传递的范围是否有效。
  • 确保访问令牌(Assert)未过期。
    要解决错误,请尝试以下方法:

作为示例,我创建了**Server**Azure AD应用程序并公开了API,添加了授权客户端应用程序:

现在,在**Client**应用程序中,我添加了如下API权限:

现在,我生成了访问令牌,以使用授权代码流传递Assert,如下所示:

https://login.microsoftonline.com/TenantID/oauth2/v2.0/token

client_id: <client_app_ID>
grant_type:authorization_code
scope: api://<API_app_ID>/test.read
code: code
redirect_uri: https://jwt.ms
client_secret: <secret>

现在,我使用scope作为https://graph.microsoft.com/User.Read.All,使用**on-behalf-of**流生成访问令牌

https://login.microsoftonline.com/TenantID/oauth2/v2.0/token

client_id: <API_app_ID>
client_secret: <API_app_secret>
scope: https://graph.microsoft.com/User.Read.All
grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion: <paste_token_from_above_request>
requested_token_use: on_behalf_of

注意:要获取用户配置文件,**aud**应为https://graph.microsoft.com

当我解码令牌时,**aud**是Microsoft Graph,如下所示:

当我使用上面生成的访问令牌时,我能够成功获取用户配置文件如下所示:

GET https://graph.microsoft.com/v1.0/users/UserID

您还可以在**on-behalf-of流中生成访问令牌时使用https://graph.microsoft.com/.default**作用域。
要解决此错误,请在代码中进行如下更改:

var scopes = new[] { "https://graph.microsoft.com/User.Read.All" };
var tenantId = "TenantID";
var clientId = "ClientID";
var clientSecret = "ClientSecret";

var options = new OnBehalfOfCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var oboToken = "JWTToken";
var onBehalfOfCredential = new OnBehalfOfCredential(tenantId, clientId, clientSecret, oboToken, options);
var graphClient = new GraphServiceClient(onBehalfOfCredential,scopes);

var result = graphClient.Users.GetAsync((requestConfiguration) =>
{                requestConfiguration.QueryParameters.Count = true; 
                 requestConfiguration.QueryParameters.Search = "\"displayName:rock\"";  
                 requestConfiguration.QueryParameters.Orderby = new string[] { "displayName" };  
                 requestConfiguration.QueryParameters.Select = new string[] { "id", "displayName", "mail" };    
                 requestConfiguration.Headers.Add("ConsistencyLevel", "eventual");
}).Result;

并确保生成访问令牌,以便将其作为具有适当范围的Assert传递。

参考资料:

Choose-authentication-providers.md 在主·微软图形· GitHub由andrueastman
GitHub Web API calling a downstream API on behalf of the user由尼哈-巴尔加瓦

相关问题