Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用客户端/机密调用Azure AD安全web API_C#_Oauth_Azure Active Directory - Fatal编程技术网

C# 使用客户端/机密调用Azure AD安全web API

C# 使用客户端/机密调用Azure AD安全web API,c#,oauth,azure-active-directory,C#,Oauth,Azure Active Directory,我已经干了一整天了,快把我逼疯了。我在Azure上发布了一个web API,该API由Azure AD身份验证保护。我已经将这个API与一个移动应用程序结合使用很长一段时间了。在移动应用程序中,我使用库进行客户端身份验证(广告中的Microsoft帐户),这非常有效。在应用程序中,API请求通过X-ZUMO-AUTH头进行身份验证 现在,对于应用程序的新部分,我有一个C#控制台应用程序,它还需要能够调用该应用程序。这需要独立运行,因此无需要求用户凭据。因此,我在Azure AD中创建了一个应用程

我已经干了一整天了,快把我逼疯了。我在Azure上发布了一个web API,该API由Azure AD身份验证保护。我已经将这个API与一个移动应用程序结合使用很长一段时间了。在移动应用程序中,我使用库进行客户端身份验证(广告中的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
        },
    });
我已经三次检查了所有变量。我还验证了承载令牌是否正确地传递给服务(Fiddler显示)。一切看起来都很好,但服务器仍然以未经授权的响应

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

我已经看到了关于这个主题的相关问题,以及所有的样本(作为灵感的主要来源)。我尝试了所有的变化,但都没有用。所以我要寻找的是找出实际问题所在的方法。“Unauthorized”至少可以说有点含糊不清,所以我试图找出为什么电话会以这种响应返回。非常感谢您的帮助

附加端点信息

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

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端点的应用程序服务实例的权限。这些电话将:

https://{app service url}.azurewebsites.net/api/controller
当我试着去做的时候,我注意到了更奇怪的行为。我想现在我只需要将这个特定的控制器设置为[AllowAnonymous],这样我就可以在没有任何身份验证的情况下调用它。但当我这样做并忽略传递承载令牌时,我仍然会得到未经授权的响应。这强化了我的观点,即服务器端有问题,这可能与移动应用程序如何绑定到webapi控制器有关


不要紧,控制器被强制授权是由Web应用程序级身份验证设置引起的,

您的请求是什么或显示您的端点值?确保您的accesstoken具有访问端点的权限。我看到你的代码没有问题更新了关于端点的更多信息。是否有某种方法可以“解码”或分析我获得的访问令牌,以了解有关权限的更多信息?您的accesstoken仅从Azure访问api,如resource=
https://management.core.windows.net/
,端点=
https://management.azure.com/subscriptions/subscriptionid/resourceGroups?api-版本=2015-12-01
或资源=
https://graph.windows.net/
,端点=
https://graph.windows.net/tenantid/users?api-version=1.6
您可以使用这些简单的api来确认您的accesstoken是否正确,更多关于你可以调用的信息取决于:1。您在配置时通过应用程序权限(因为您使用的是客户端凭据)授予您应用程序权限的内容。2.您在运行时请求访问的资源。对于#1,您是否为API定义了应用程序权限,然后在web apps应用程序权限配置中检查这些权限?对于#2,您需要确保指定应用程序的URI作为资源。