访问令牌验证失败。无效的观众。 Microsoft Graph C#应用程序

问题描述 投票:0回答:1

我正在尝试运行以下代码来获取用户详细信息,以作为来自Azure Active Directory的响应:

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace AADConsole2
{
    class Program
    {

        private const string aadInstance = "https://login.microsoftonline.com/{0}";
        private const string resource= "https://graph.microsoft.com";
        private const string GraphServiceObjectId = "XXX";
        private const string TenantId = "XXXXX";
        private const string tenant = "company.onmicrosoft.com";
        private const string ClientId = "XXXX";
        private static string appKey= "XXXXXXXXXXXXXXXX";
        static string authority = String.Format(System.Globalization.CultureInfo.InvariantCulture, aadInstance, tenant);

        private static HttpClient httpclient = new HttpClient();
        private static AuthenticationContext context = null;
        private static ClientCredential credential = null;

        static void Main(string[] args)
        {

            context = new AuthenticationContext(authority);
            credential = new ClientCredential(ClientId, appKey);
            Task<string> token = GetToken();
            token.Wait();
            Console.WriteLine(token.Result);
            Task<string> users = GetUsers(token.Result);
            users.Wait();
            Console.WriteLine(users.Result);
            Console.ReadLine();
        }

        private static async Task<string> GetUsers(string result) {
            //throw new NotImplementedException();
            string users = null;
            string queryString = "test";
            var uri = "https://graph.microsoft.com/v1.0/users";

            httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result);
            var getResult = await httpclient.GetAsync(uri);

            if(getResult.Content != null)
            {
                users = await getResult.Content.ReadAsStringAsync();

            }
            return users;

        }


        private static async Task<string> GetToken()
        {
            AuthenticationResult result = null;
            string token = null;
            result = await context.AcquireTokenAsync(resource, credential);
            token = result.AccessToken;
            return token;



        }
    }
}

我遇到错误:

uMCJ9.FdttazjoKYZWP_SmC5B7Nd3kOF-jRs62WLKYovDA8qMvybLTw8yIUoihp7I00ctJGJHDoEbhbIi0XHp9Ujdq0bNPlG-L5SoE9IFSoxX3ZQOZwSf90b_nDapbHJ8KCHZUnCBOwVnYiTXtpIQfrDVqqENarrIGa_uUbiriomYiB8gVkKWe6PB-I4lsYPEmMNnnpdvIf1eV_CsTmvUA54Ch1Zdip9mxrzRqrUqsx6vUTo0riCmiCxRg7mH2DuMaEPTZuQAMwhrQM_EwNsgx1yX1VsCKkL1Gu7CV_dqW5xxYlE7NEQmorT8W6aySbiBzsUWisJNnaR8RqZzeAUlSVMKBiw
{"odata.error":{"code":"Request_BadRequest","message":{"lang":"en","value":"Invalid domain name in the request url."},"requestId":"01ab745b-8a3f-48cc-9542-0c6abcae8950","date":"2020-02-17T22:41:28"}}
r

[另外,请帮助我获取租户名称(这是名称还是字母数字ID?),当前我只是在租户名称下方使用。私有常量字符串租户=“ company.onmicrosoft.com”;

我只想在此代码中使用Microsoft Graph API。谢谢。

c# azure-active-directory microsoft-graph
1个回答
2
投票

我还想知道此代码是否使用Microsoft Graph或Azure AD。

此代码使用Azure AD Graph API。如果请求uri是正确的,它可以正常工作。您应该使用租户名称,而不是company.onmicrosoft.com,并且必须指定api版本。因此,请求uri应该是

var uri = "https://graph.windows.net/{your_tenant_name}.onmicrosoft.com/users?api-version=1.6"; 

如果租户名称错误,您将遇到无效域名错误。

我不确定是否要使用https://graph.microsoft.comhttps://graph.windows.net

您可以使用任何一个。但是官方文档强烈建议您使用Microsoft Graph而不是Azure AD Graph API来访问Azure Active Directory(Azure AD)资源

如果要使用Microsoft Graph API,只需更改resource的值并请求api url。资源将为https://graph.microsoft.com。请求的api网址为var uri = "https://graph.microsoft.com/v1.0/users";

[注意:记住要在Azure门户中为您的应用程序授予正确的权限并获得管理员的同意。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.