使用UserCredentials访问令牌验证错误MS Graph

时间:2017-02-08 10:29:50

标签: .net authentication azure-active-directory microsoft-graph adal

我正在尝试使用AAD帐户访问MS Graph,此帐户是全局管理员,并且每个权限都被委派。我希望在没有交互式登录的情况下进行,即使用UserPasswordCredential。尝试访问MS Graph时,我收到错误:

enter image description here

我的流程:

获取令牌:

public async Task<string> GetUserAccessTokenAsync()
        {
            UserPasswordCredential userPasswordCredential = new UserPasswordCredential("user@tenant.onmicrosoft.com", "password");
            AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/tenant.onmicrosoft.com");
            AuthenticationResult token = await authContext.AcquireTokenAsync("https://graph.windows.net", appId, userPasswordCredential);

            return token.AccessToken;
        }

使用令牌:

public static GraphServiceClient GetAuthenticatedClient()
        {
            GraphServiceClient graphClient = new GraphServiceClient(
                new DelegateAuthenticationProvider(
                    async (requestMessage) =>
                    {
                        Adal adal = new Adal();
                        string accessToken = await adal.GetUserAccessTokenAsync();

                        // Append the access token to the request.
                        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
                    }));
            return graphClient;
        }

尝试调用MS Graph来读取事件:

 try
        {
            // Get events.
            items = await eventsService.GetMyEvents(graphClient);
        }
        catch (ServiceException se)
        {
            //this is where I get the error
        }

委托权限: enter image description here

我出错的任何想法?

3 个答案:

答案 0 :(得分:2)

你的资源URI至少是错误的。它应该是:

public async Task<string> GetUserAccessTokenAsync()
{
   UserPasswordCredential userPasswordCredential = new UserPasswordCredential("user@tenant.onmicrosoft.com", "password");
   AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/tenant.onmicrosoft.com");
   AuthenticationResult token = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", appId, userPasswordCredential);

   return token.AccessToken;
}

https://graph.windows.net/适用于Azure AD Graph,而非MS Graph。

对于MS Graph API,您必须使用https://graph.microsoft.com/

答案 1 :(得分:0)

经过更多研究后,我了解到我们需要获得管理员权限。在文档中找到:“仅限应用程序的作用域(也称为应用程序角色)为应用程序授予作用域提供的全部权限。仅应用程序作用域通常由作为服务运行但没有登录用户的应用程序使用在场“ https://graph.microsoft.io/en-us/docs/authorization/permission_scopes 我使用用户令牌获得了成功的结果,因为那是在委派的权限下。 希望这可以帮助将来的某个人。

答案 2 :(得分:0)

经过进一步研究后,我们确实需要管理员权限,因为我们使用的是仅限应用程序的范围而不是委派范围 权限。仅限应用程序范围内的基本读取操作仅指定为Admin。希望这可以帮助有同样问题的人。 https://graph.microsoft.io/en-us/docs/authorization/permission_scopes