我下载了下面的示例,以便从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 ...
帮助赞赏尝试好几天......
答案 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将让您的客户端请求具有新范围的访问令牌。