尝试获取用于访问自定义API的令牌时出现MSAL错误消息AADSTS65005

时间:2017-07-22 12:37:05

标签: c# azure authentication azure-active-directory msal

我下载了下面的示例,以便从MS Graph获取访问令牌,它运行正常。现在我更改了代码以从自定义Web API获取令牌。在apps.dev.microsoft.com上,我注册了一个客户端应用程序和一个API。

Client and server registration in AD

private static async Task<AuthenticationResult> GetToken()
    {
        const string clientId = "185adc28-7e72-4f07-a052-651755513825";

        var clientApp = new PublicClientApplication(clientId);

        AuthenticationResult result = null;

        string[] scopes = new string[] { "api://f69953b0-2d7f-4523-a8df-01f216b55200/Test" };

        try
        {
            result = await clientApp.AcquireTokenAsync(scopes, "", UIBehavior.SelectAccount, string.Empty);
        }
        catch (Exception x)
        {
            if (x.Message == "User canceled authentication")
            {

            }
            return null;
        }
        return result;
    }

当我运行代码时,我通过对话框登录AD,在调试器中获得以下异常:

错误:客户端无效 消息=“AADSTS65005:应用程序'CoreWebAPIAzureADClient'询问资源上不存在的范围'offline_access'。请联系应用程序供应商。\ r \ nTrace ID:56a4b5ad-8ca1-4c41-b961-c74d84911300 \ r \ n相关ID :a4350378-b802-4364-8464-c6fdf105cbf1 \ r ...

Error message

帮助赞赏尝试好几天......

3 个答案:

答案 0 :(得分:3)

对于仍然遇到此问题的任何人,请阅读以下内容:

https://www.andrew-best.com/posts/please-sir-can-i-have-some-auth/

这个家伙反映了您的所有挫败感后,您会感觉更好,除了他会解决...

如果使用adal.js,则需要在您的范围内使用

const tokenRequest = {
    scopes: ["https://management.azure.com/user_impersonation"]
};

我花了一个星期

const tokenRequest = {
    scopes: ["user_impersonation"]
};

..因为这是图形API范围采用的格式

答案 1 :(得分:2)

截至今天,V2 Endpoint不支持Microsoft Graph以外的API访问。请参阅V2应用模型here的限制。

  

独立Web API

     

您可以使用v2.0端点构建受其保护的Web API   OAuth 2.0。但是,该Web API只能从一个接收令牌   具有相同应用程序ID的应用程序。您无法访问Web   来自具有不同应用程序ID的客户端的API。客户端   无法请求或获取Web API的权限。

对于您要完成的特定方案,您需要使用V1 App模型(在https://portal.azure.com上注册应用)。

在不久的将来,V2应用程序将能够调用除Microsoft Graph以外的其他API,因此您的方案将得到支持,但现在情况并非如此。您应该留意我们有关此更新的文档。

答案 2 :(得分:0)

在AAD中(服务器)应用程序注册中,您需要在the oauth2Permissions element中指定范围。

您可能已经设置了user_impersonation范围。复制该基准作为基准,为其提供唯一的GUID和value,然后AAD将让您的客户端请求具有新范围的访问令牌。