想象一下在 Windows Azure 中注册的客户端和服务应用程序。
客户端是一个控制台,在无人值守的情况下运行(例如过夜执行测试) 该服务是受 oAuth 保护的 WebAPI 服务,通常使用托管在 Azure 中的 OpenID Connect 进行访问。
客户端如何在没有任何类型的用户登录交互的情况下对服务进行身份验证(即应用程序使用 ADAL .Net 对服务进行自身身份验证)?
我尝试了 ADAL .Net Daemon to WebAPI sample但它仍然弹出一个身份验证对话框...
谢谢!
[编辑]这里有一些代码非常大致显示我如何与客户端进行通信。所有应用程序 ID 等均正确。
var authContext = new AuthenticationContext("https://login.windows.net/common");
var result = await authContext.AcquireTokenAsync(ServiceAppId, ClientCredential);
var client = new HttpClient
{
BaseAddress = new Uri("https://localhost:44301/"),
};
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
AuthenticationHeaderScheme.Bearer,
result.AccessToken);
var response = await client.GetAsync("api/something");
var jsonString = response.Content.ReadAsStringAsync().Result;
这只会生成登录页面 HTML...
我还尝试将 [HostAuthentication("OAuth2Bearer")]
等添加到服务 api Controller 并添加 OWIN 启动逻辑,但无济于事,例如:
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
TokenValidationParameters = new TokenValidationParameters
{
ValidAudience = myRealm,
},
Tenant = "mytenant.onmicrosoft.com",
AuthenticationType = BearerAuthenticationType.OAuth2Bearer,
});
最佳答案
编辑:重新阅读原始帖子,我想我现在明白发生了什么。您提到您的应用程序上有 OpenId Connect,当您访问 Web API 时,您会返回 HTML。我怀疑当您点击 Web API 时会触发 OpenId Connect 中间件,而不是 Oauth2 中间件。如果是这种情况,我建议您查看 http://www.cloudidentity.com/blog/2014/04/28/use-owin-azure-ad-to-secure-both-mvc-ux-and-web-api-in-the-same-project/有关如何使基于重定向的中间件和 OAuth2 protected 资源中间件在同一项目中共存的说明。
原答案:你试过吗https://github.com/AzureADSamples/NativeClient-Headless-DotNet ? 那应该可以满足您的需求。抱歉,在电话里说得太简洁了:-) 华泰 五、
关于azure - 如何对 WebAPI 进行无人值守的 oauth/openid 身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25777676/