【发布时间】:2017-03-02 21:27:48
【问题描述】:
我有一个 asp.net web api 2,它使用 AAD(Azure AD) 对用户进行身份验证。目前我只有一个有角度的 web 应用程序访问 api。用户的身份验证由 adal.js 处理,这是可行的。现在我正在尝试添加一个 winforms 应用程序,该应用程序也针对同一个 AAD 进行身份验证。这也有效,这意味着我得到了一个身份验证令牌,但是当我调用 API 时它返回一个 401 消息。我查看了Azure AD samples at github 并将我的代码基于它们。
在 web api 中,我在 Startup.Auth.cs 中有以下代码:
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Audience = ConfigurationManager.AppSettings["ida:Audience"],
Tenant = ConfigurationManager.AppSettings["ida:Tenant"]
});
从 Azure AD 复制受众和租户密钥。
我在 Winforms 应用程序中使用以下代码:
string authority = "https://login.microsoftonline.com/{TenantID}";
string resourceURI = "APP ID URI from the Web API registered in Azure AD";
string clientID = "Client ID from the WinForms Application registered in Azure AD";
Uri returnUri = new Uri("Registered return uri");
AuthenticationContext _ac = new AuthenticationContext(authority);
AuthenticationResult _arr = _ac.AcquireToken(resourceURI, clientID, returnUri);
回顾一下,我可以在 winforms 应用程序中对用户进行身份验证,但是当我从 API 请求数据时,api 会以 401 错误响应。我已经检查了 http 请求,并且令牌正在被注入到请求中。
谢谢大家的帮助
【问题讨论】:
-
您是否在浏览器中创建了一个 cookie 作为身份验证的结果?我假设您的 API 具有可能会启动 401 的 [Auhorize] 属性。
-
你能提供一个 fiddler 跟踪来捕获对 api 的请求吗?
-
是的,API 端点具有 [Authorize] 属性,您能否详细说明您在 Fiddler 跟踪中的确切需求。因为在跟踪中,Fiddler 中的原始请求是相同的,除了 Auth 令牌。通过 ADALJS 收到的与从 ADAL.net 收到的不同
-
Fiddler 跟踪捕获使用 Adal.Net 进行身份验证的请求以及随后使用身份验证令牌对 api 的请求。
-
@ezile 我知道你发表评论已经有一段时间了,但我们解决了这个问题。这是由于我们的配置,在 api 上我们使用 GUID 进行配置,在 WFA 上我们使用了我们认为它们可以互换的 URL,但它们不是,谢谢您的帮助