如何对WebAPI执行无人参与的oauth/openid身份验证



想象一个在Windows Azure中注册的客户端和服务应用程序。

客户端是一个控制台,在无人值守的前提下运行(例如通宵执行测试)该服务是受oAuth保护的WebAPI服务,通常使用托管在Azure中的OpenID Connect进行访问。

在没有任何用户登录交互的情况下,客户端如何对服务进行身份验证(即应用程序使用ADAL.Net对服务进行自我身份验证)?

我尝试了ADAL.Net守护程序到WebAPI的示例,但它仍然会弹出一个身份验证对话框。。。

谢谢!

[edit]以下是一些代码,可以大致向展示我如何与客户端进行通信。所有的应用程序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控制器中,并添加OWIN启动逻辑,但没有成功,例如:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions
    {
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = myRealm,
        },
        Tenant = "mytenant.onmicrosoft.com",
        AuthenticationType = BearerAuthenticationType.OAuth2Bearer,
    });

编辑:重新阅读原始文章,我想我现在明白发生了什么。你提到你的应用程序上有OpenId Connect,当你访问API时,你会得到HTML。我怀疑当您访问Web API而不是Oauth2中间件时,会触发OpenIdConnect中间件。如果是这样的话,我建议你看看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保护的资源中间件共存于同一项目的说明。

原始答案:你试过了吗https://github.com/AzureADSamples/NativeClient-Headless-DotNet?这应该是你想要的。抱歉简洁,在电话中:-)HTHV.

最新更新