4

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

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\n跟踪 ID: 56a4b5ad-8ca1-4c41-b961-c74d84911300\ r\n相关 ID:a4350378-b802-4364-8464-c6fdf105cbf1\r...

错误信息

帮助感谢尝试了几天...

4

3 回答 3

6

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

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 范围采用的格式

于 2020-02-29T13:36:14.510 回答
4

截至今天,V2 Endpoint 不支持 Microsoft Graph 以外的 API 访问。在此处查看 V2 应用模型的限制。

独立的 Web API

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

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

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

于 2017-07-22T17:31:17.217 回答
0

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

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

于 2018-09-21T19:35:52.233 回答