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

Jas*_*per 5 c# oauth azure-active-directory

我一整天都在这里,它正在推动我努力.我在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);
Run Code Online (Sandbox Code Playgroud)

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

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

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions
    { 
        Tenant = aadTenant,
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = aadAudience
        },
    });
Run Code Online (Sandbox Code Playgroud)

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

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

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

其他端点信息

根据要求,这里是我正在使用的端点的一些信息:

authority = https://login.microsoftonline.com/{aad-tenant-name}
Run Code Online (Sandbox Code Playgroud)

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

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

authority = https://login.microsoftonline.com/{aad-guid}/oauth2/authorize
Run Code Online (Sandbox Code Playgroud)

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

https://{app service url}.azurewebsites.net/api/controller
Run Code Online (Sandbox Code Playgroud)

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

没关系,控制器被强制授权是由Web App级别身份验证设置引起的,此处记录在案