C# 如何使用ADAL、NetStandard和Azure AD在不提示CRM Dynamics Online Web服务的情况下进行身份验证

C# 如何使用ADAL、NetStandard和Azure AD在不提示CRM Dynamics Online Web服务的情况下进行身份验证,c#,azure-active-directory,dynamics-crm-online,adal,.net-standard,C#,Azure Active Directory,Dynamics Crm Online,Adal,.net Standard,我目前正在尝试创建一个Xamarin应用程序,以便从Dynamics 365在线实例获取一些信息。通过AD进行身份验证并访问CRM api的代码被导出到NetStandard(v1.6)库中 我使用以下NUGET: Microsoft.IdentityModel.Clients.ActiveDirectory(3.13.9) NETStandard.Library(1.6.1) 为了将广告链接到我的Dynamics实例,我遵循了以下教程: 这是我的ActiveDirectory帮助程序: p

我目前正在尝试创建一个Xamarin应用程序,以便从Dynamics 365在线实例获取一些信息。通过AD进行身份验证并访问CRM api的代码被导出到NetStandard(v1.6)库中

我使用以下NUGET:

  • Microsoft.IdentityModel.Clients.ActiveDirectory(3.13.9)
  • NETStandard.Library(1.6.1)
为了将广告链接到我的Dynamics实例,我遵循了以下教程:

这是我的ActiveDirectory帮助程序:

public static class ADHelper
    {

        public async static Task<AuthenticationResult> GetAuthAsync(Uri uri, ClientCredential creditential)
        {
            AuthenticationParameters ap = await AuthenticationParameters.CreateFromResourceUrlAsync(uri);

            String authorityUrl = ap.Authority;
            String resourceUrl = ap.Resource;

            AuthenticationResult result = null;

            AuthenticationContext authContext = new AuthenticationContext(authorityUrl, false);
            result = await authContext.AcquireTokenAsync(resourceUrl, creditential);
            return result;
        }
    }
用于CRMClient构造函数的参数:

  • =>数据OData端点
  • ClientCredential(AppId,AppKey)=>作为凭据
Azure AD还给了我一个令牌,但是UserInfo、TenantId和idToken都是
null
(这可能是我问题的部分原因)

目前,返回的内容是HTML office 365登录页面,而不是我想要获取的数据

有人能帮我吗

public class CRMClient
{
    private AuthenticationResult Auth { get; set; }
    private Uri baseUri { get; set; }

    public CRMClient(Uri uri, ClientCredential creditential)
    {
        baseUri = uri;
        Auth = ADHelper.GetAuthAsync(uri, creditential).Result;
    }

    public void getObject()
    {
        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Auth.AccessToken);
            client.Timeout = new TimeSpan(0, 2, 0);
            client.BaseAddress = baseUri;
            HttpResponseMessage message = client.GetAsync("/accounts").Result;
            String content = message.Content.ReadAsStringAsync().Result;
        }
    }