我是Azure AD的新手并尝试使用AD保护的api。我已成功创建并保护了api,但在我的Windows窗体应用程序中花费了很多时间。我在Link尝试了文档,但在此行中出现编译时错误
AuthenticationResult ar =
ac.AcquireToken("https://cloudidentity.net/WindowsAzureADWebAPITest",
"a4836f83-0f69-48ed-aa2b-88d0aed69652",
new Uri("https://cloudidentity.net/myWebAPItestclient"));
现在ADAL中没有这样的方法。有我试过的异步版本,但采用不同的参数
AuthenticationResult ar =
ac.AcquireTokenAsync("https://cloudidentity.net/WindowsAzureADWebAPITest",
"a4836f83-0f69-48ed-aa2b-88d0aed69652",
new Uri("https://cloudidentity.net/myWebAPItestclient"), IPlatformParameters);
除了其他信息,它还需要IPlatformParameters对象,我不知道。我试图传递null然后继续,但是这行中有错误
string authHeader = ar.CreateAuthorizationHeader();
错误是ADAL对ar对象没有这样的方法。所以我跳到了这个 tutorial,因为他也使用了Windows窗体应用程序。他写的代码是
Task<AuthenticationResult> ar = authContext.AcquireTokenAsync("https://carsforher.onmicrosoft.com/SecuredCars_20160722021100", "2640aca3-a35e-42f8-8f6d-2e5fe1a09df4", new Uri("http://localhost"), null);
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ar.AccessToken).....
但是ar对象没有属性作为AccessToken。然后我尝试从Azure Documentation下载示例应用程序,但是他们也编写了完全相同的代码,遗憾的是这些代码不起作用。我使用的ADAL版本是3.12.0.827。请帮助我弄清楚如何获得访问令牌并使用api。
答案 0 :(得分:1)
您错误地使用AcquireTokenAsync: AcquireTokenAsync返回任务,而不是AuthenticationResult对象,因此方法'CreateAuthorizationHeader'和属性'AccessToken'(不是真的)“丢失”。
您的代码的固定版本将是:
AuthenticationResult ar = ac.AcquireTokenAsync("https://cloudidentity.net/WindowsAzureADWebAPITest",
"a4836f83-0f69-48ed-aa2b-88d0aed69652",
new Uri("https://cloudidentity.net/myWebAPItestclient"), IPlatformParameters).Result;
string authHeader = ar.CreateAuthorizationHeader();
string accessToken = ar.AccessToken;
或或者,所以你的代码真的会运行async ,你可以在方法签名中添加'async'并执行:
AuthenticationResult ar = await ac.AcquireTokenAsync("https://cloudidentity.net/WindowsAzureADWebAPITest",
"a4836f83-0f69-48ed-aa2b-88d0aed69652",
new Uri("https://cloudidentity.net/myWebAPItestclient"), IPlatformParameters);
string authHeader = ar.CreateAuthorizationHeader();
string accessToken = ar.AccessToken;