3

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

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

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

我尝试了ADAL .Net Daemon to WebAPI 示例,但它仍然会弹出一个身份验证对话框...

谢谢!

[编辑]这里有一些代码非常粗略地展示了我如何从客户端进行通信。所有应用程序 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,
    });
4

1 回答 1

2

编辑:重新阅读原始帖子,我想我现在明白发生了什么。您提到您的应用程序上有 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 保护的资源中间件在同一个项目中共存的说明。

原始答案:您是否尝试过https://github.com/AzureADSamples/NativeClient-Headless-DotNet?那应该做你正在寻找的。对不起,在电话里很简洁:-) HTH V。

于 2014-09-14T07:19:16.147 回答