当前位置: 首页 > 知识库问答 >
问题:

如何获得访问令牌,以调用MS图形代表一个用户在控制台应用程序使用msal?

夏谦
2023-03-14

我有一个SPA应用程序,它使用AAD v2身份验证与我的后端Web API通信。现在我正在开发一个控制台应用程序,代表登录到SPA应用程序的用户调用Microsoft Graph。

我有一个用户的有效访问令牌(用于调用后端Web API)。我想使用这个访问令牌请求一个新的令牌来访问MS Graph。

下面是控制台应用程序的代码,用于使用MSAL.NET请求带有MS图形作用域的新访问令牌:

string clientId = "<clientId>";
string clientSecret = "<clientSecret>";
string accessToken = "<validAccessTokenForWebApi>";
string assertionType = "urn:ietf:params:oauth:grant-type:jwt-bearer";
string[] scopes = new string[] { "User.Read", "Mail.Send" };
string graphAccessToken = null;

try
{
    var app = ConfidentialClientApplicationBuilder
                .Create(clientId).WithClientSecret(clientSecret).Build();

    var userAssertion = new UserAssertion(accessToken, assertionType);

    var result = app.AcquireTokenOnBehalfOf(scopes, userAssertion)
                    .ExecuteAsync().GetAwaiter().GetResult();

    graphAccessToken = result.AccessToken;
}
catch (MsalServiceException ex)
{
    throw;
}

但是,当我调用app.AcquireTokenOnBehalfOf()时,我得到一个异常:

AADSTS50013:断言签名验证失败。[原因-提供的签名值与预期的签名值不匹配。,客户端使用的密钥指纹:'BB839F3453C7C04068B078EDADAB8E6D5F382E76',找到密钥'start=06/04/2019 00:00:00,end=06/04/2021 00:00:00']

共有1个答案

阙弘博
2023-03-14

如果您想代表flow使用OAuth 2.0,我认为您不需要开发一个控制台应用程序来调用graph API。您可以直接使用后端Web API应用程序获取访问令牌,然后调用Microsoft Graph。根据我的理解,你只要做这些步骤

  1. 在客户端应用程序中登录用户
  2. 获取Web API(TodoListService)的令牌并调用它。
  3. Web API然后调用另一个下游Web API(Microsoft Graph)。

更多详情请参阅示例。

    null

>

  • 在Azure门户中,导航到您的Web api应用程序注册,并单击清单部分。

    找到属性knownClientApplications并添加SAP应用程序的客户端ID

    获取访问令牌以调用web api

       GET https://login.microsoftonline.com/common/oauth2/v2.0/authorize
    ?scope=<you web api scope> openid
        &redirect_uri=<your sap app redirect url>
        &nonce=test123
        &client_id=<you sap app client id>
        &response_type=id_token token
    
    POST https://login.microsoftonline.com/common/oauth2/v2.0/token
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
    &client_id=<you web api client id>
    &assertion=<you acess token you get in above steps>
    &client_secret=<you app secret> 
    &scope=https://graph.microsoft.com/user.read
    &requested_token_use=on_behalf_of
    

    MSAL.NET代码

    string[] scopes = { "user.read" };
                string accesstoken = "";
    
                string appKey = "yor web api client secret";
                string clientId = "your web api application id";
    
                var app = ConfidentialClientApplicationBuilder.Create(clientId)
                  .WithClientSecret(appKey)
                  .Build();
                UserAssertion userAssertion = new UserAssertion(accesstoken, 
     "urn:ietf:params:oauth:grant-type:jwt-bearer");
                var result = app.AcquireTokenOnBehalfOf(scopes, userAssertion).ExecuteAsync().Result;
                Console.WriteLine(result.AccessToken);
    

  •  类似资料:
    • 我有一个Web应用程序(Angular 7),它使用MSAL Angular对Azure AD用户进行身份验证,并获取访问我的Web API(.NET 4.6)的访问令牌。这两个应用都已在Azure门户中注册,并具有以下权限,如下所述: Web应用程序:for Web API(委派) Web API:<代码>用户。阅读邮政发送MS图表(委派) 现在,我想使用ADAL for从Web API调用Mi

    • 我需要在Spring Boot应用程序的服务层中获得访问令牌(grant_type=client_credentials),以便与其他微服务对话(服务到服务的交互)。这一层没有spring http会话或auth,我只有client_id、client_secret和令牌URL。这些属性在Application.properties中设置为: 这在Spring Security OAuth中似乎很

    • 我正在尝试access Microsoft Graph API使用以下endpoint查询用户所属的组列表 https://graph.microsoft.com/v1.0/users/{userID}/memberof 但从过去两天开始,我的查询失败了,回复如下 谢谢你的帮助。

    • 我已经创建了一个webapp类型的Azure AAD应用程序,它具有客户端秘密和重定向URL。现在,我想获得一个访问令牌代表用户使用AAD应用程序。通过查看文档,到目前为止,我得到了以下代码。 但这是我在尝试获取用户令牌时得到的错误,如下所示。 消息“AADSTS70002:请求正文必须包含以下参数:'Client_Secret或Client_Assertion'。\r\n跟踪ID:0E977F6

    • 问题内容: 我已经使用 Laravel Passport文档* 成功创建了 server.app 和 client.app 。一切正常。 * client.app路线: 默认情况下,此路由返回 access_token ,我可以用它执行我想做的任何事情。 请求: 返回值: 题: 如何使用 client.app中* 给定的access_token 向 server.app 发出正确请求,以获取例如