使用客户端/机密调用Azure AD安全Web API

时间:2016-05-15 16:45:15

标签: c# oauth azure-active-directory

我一整天都在这里,它把我当成了NUTS。我在Azure上发布了一个使用Azure AD身份验证进行保护的Web API。我已经将这个API与移动应用程序结合使用了很长一段时间。在移动应用程序上,我使用库进行客户端身份验证(位于AD中的Microsoft帐户),这非常有效。在应用内,API请求使用X-ZUMO-AUTH标头进行身份验证。

现在,对于应用程序的新部分,我有一个C#控制台应用程序,它也需要能够调用该应用程序。这需要独立运行,因此无需请求用户凭据。所以我在Azure AD中创建了一个应用程序,赋予它对Web API实例的权限,并为我提供了一些代码来获取身份验证令牌。然后该标记将传递到HttpClient对象:

AuthenticationContext ac = new AuthenticationContext(authority);
ClientCredential clientCred = new ClientCredential(clientID, clientSecret);
AuthenticationResult authenticationResult = await ac.AcquireTokenAsync(resource, clientCred);
string authToken = authenticationResult.AccessToken;

HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, endpoint);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
HttpResponseMessage response = await client.SendAsync(request);

服务器身份验证的设置如下:

string aadTenant = configProvider.GetConfigurationSettingValue("ida.Tenant");
string aadAudience = configProvider.GetConfigurationSettingValue("ida.Audience");

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions
    { 
        Tenant = aadTenant,
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = aadAudience
        },
    });

我已经检查了所有变量。我还验证了Bearer令牌是否正确传递给服务(Fiddler显示它)。一切似乎都很好,但仍然,服务器继续响应未经授权

我的预感是这与Web API有关。它已被设置为移动服务后端。我怀疑这是在某种程度上干扰了正常的'即使已经设置了承载认证,认证方案和401也来自不理解该认证请求的移动服务。但这只是一种预感,我不确定它是否真的有意义。

我已经看到了有关此主题的相关问题,以及所有样本(used this one作为主要灵感来源)。我已经尝试了所有的变化,但无济于事。所以我正在寻找的是找出实际问题所在的方法。 "未授权"至少可以说有点模糊,所以我试图找出为什么通过这个响应返回调用。非常感谢任何帮助。

其他端点信息

根据要求,这里有关于我使用的端点的一些信息:

authority = https://login.microsoftonline.com/{aad-tenant-name}

还尝试了管理页面上列出的OAuth2令牌端点:

authority = https://login.microsoftonline.com/{aad-guid}/oauth2/token

authority = https://login.microsoftonline.com/{aad-guid}/oauth2/authorize

对于客户端,我传递的ClientID信息和我从我创建的应用程序的AAD应用程序页面获得的秘密。我已授予应用程序权限以访问我的Web API端点的App Service实例。这些电话将会:

https://{app service url}.azurewebsites.net/api/controller

在试图实现这一目标的过程中,我注意到了更多奇怪的行为。我现在想,我只是将这个特定的控制器设置为[AllowAnonymous],这样我就可以在没有任何身份验证的情况下调用它。但是,当我这样做并省略传递Bearer令牌时,我仍然会获得未经授权的响应。这种做法强调了我的想法,即服务器端出现了问题,这可能与移动应用程序内容绑定到webapi控制器有关。

没关系,强制授权的控制器是由Web App级别身份验证设置引起的,documented here

0 个答案:

没有答案