【发布时间】:2016-07-08 08:23:00
【问题描述】:
我在启用了 Azure AD 身份验证的 Azure 网站上运行了一个标准 Web API,当在浏览器中浏览 API 时,我可以通过浏览器登录并访问 API。
但是,WPF 桌面应用程序在提交请求时收到未经授权的响应:
var authContext = new AuthenticationContext(authority, new FileCache());
var accessToken = await authContext.AcquireTokenAsync(apiResourceid, clientId, redirectUri,
new PlatformParameters(PromptBehavior.Auto));
// accessToken is valid
var apiUrl = "https://example.azurewebsites.net/api/list";
var request = new HttpRequestMessage(HttpMethod.Get, apiUrl);
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.AccessToken);
var response = await httpClient.SendAsync(request);
认证成功,调试时可以看到用户信息。
我无权访问 Azure 帐户,但我确信 Service AD 应用程序配置正确,允许访问客户端 AD 应用程序,因为在备用帐户(未正确配置)上进行测试时,AuthenticationContext.AcquireTokenAsync 方法失败了。
我确实注意到 -(时间当然是 UTC)AuthenticationResult.ExpiresOn 总是在过去,但看不到延长它的方法,这应该是未来的日期吗?
请求:
GET https://example.azure
websites.net/api/categorisation HTTP/1.1
Authorization: Bearer eyJ0eXAiO...
Host: example.azurewebsites.net
回复:
HTTP/1.1 401 Unauthorized
Content-Length: 58
Content-Type: text/html
Server: Microsoft-IIS/8.0
WWW-Authenticate: Bearer realm="example.azurewebsites.net"
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=e35f2977dba55e6708887e762940f75c2a0fcb0a9df4e1cbe0d3f10a614c59b8;Path=/;Domain=example.azurewebsites.net
Date: Fri, 08 Jul 2016 07:51:13 GMT
You do not have permission to view this directory or page.
更新:
我已经在我有权访问的 Azure 帐户中重新创建了环境,但仍然收到未经授权的响应(在浏览器中可以正常工作)。
【问题讨论】:
-
您能否在您的网站 Startup.Auth.cs 中发布代码以设置 Azure AD 身份验证?或者,如果您在 Azure 网站中使用“身份验证/授权”选项,您能否分享您配置的值/设置?
-
另外,关于这个:“身份验证成功,调试时我可以看到用户信息。”,你是说用 Visual Studio 运行 WPF 应用程序时,你成功连接到 API,但是当从exe运行它不?如果是这样,您在运行 .exe 时是否会收到提示?
-
@Saca API 正在使用 Azure 网站身份验证。 Provider 是使用 Express Management Mode 配置的“Azure Active Directory”,Azure AD App 设置为 AD Web Service 应用程序。
-
@Saca 不幸的是,API 请求在调试或运行 exe 时总是收到 401。在这两种情况下,
AcquireToken都是成功的。 -
使用 Pluralsight 中配置为使用我的 Azure AD 的代码示例在本地工作,但是当我部署到 Azure(并禁用自动身份验证)时,客户端应用程序无法访问 API。
标签: c# .net asp.net-web-api azure-active-directory