C# 使用Azure AD v2.0进行安全保护时,在[Authorize]修饰的Web API方法上获取404
在我的场景中,我有一个Windows UWP客户端应用程序,它使用OAuth 2.0访问令牌和Azure AD v2.0端点验证用户并访问受保护的Web API服务。Web API是使用ASP.NET Core 2.0构建的。我在Azure samples GitHub上找不到任何具有精确配置的现有示例,所以我决定自己构建它。我能够对用户进行身份验证并访问Microsoft Graph以获取用户的配置文件,但当我尝试访问Web API时,会收到404 Not Found错误消息。相同Web API的不安全方法(未经[授权]修饰)可以正常工作 Web API的My Startup.cs包含以下部分:C# 使用Azure AD v2.0进行安全保护时,在[Authorize]修饰的Web API方法上获取404,c#,asp.net,azure,core,C#,Asp.net,Azure,Core,在我的场景中,我有一个Windows UWP客户端应用程序,它使用OAuth 2.0访问令牌和Azure AD v2.0端点验证用户并访问受保护的Web API服务。Web API是使用ASP.NET Core 2.0构建的。我在Azure samples GitHub上找不到任何具有精确配置的现有示例,所以我决定自己构建它。我能够对用户进行身份验证并访问Microsoft Graph以获取用户的配置文件,但当我尝试访问Web API时,会收到404 Not Found错误消息。相同Web AP
// Add Authentication scheme properties.
services.AddAuthentication(options => {
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
});
string clientId = Configuration["AzureAd:ClientId"];
string redirectUri = Configuration["AzureAd:RedirectUri"];
string tenant = Configuration["AzureAd:Tenant"];
string authority = String.Format(System.Globalization.CultureInfo.InvariantCulture,
Configuration["AzureAd:AadInstance"], tenant);
//OpenID Connect (OIDC) Authentication
services.AddAuthentication(options => {
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options => {
options.ClientId = clientId;
options.Authority = authority;
options.SignedOutRedirectUri = redirectUri;
options.ResponseType = OpenIdConnectResponseType.IdToken;
options.Events = new OpenIdConnectEvents
{
OnRemoteFailure = OnRemoteFailure,
OnTokenValidated = OnTokenValidated
};
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false
};
});
其中,appsettings.json配置了从apps.dev.microsoft.com应用程序注册中复制的ClientID
,并且
Tenant=“common”
。
重定向URI指向https://localhost:44353/signin-oidc
和
AadInstance设置为:https://login.microsoftonline.com/{0}/oauth2/v2.0
然后,我的客户端UWP应用程序配置了相应的设置:
private static string ClientId = "436b73b7-XXXXXXXXX";
private const string tenant = "common";
private static string authority = String.Format(System.Globalization.CultureInfo.InvariantCulture,
"https://login.microsoftonline.com/{0}/oauth2/v2.0", tenant);
public static PublicClientApplication PublicClientApp = new PublicClientApplication(ClientId, authority);
Microsoft Graph和自定义API的API端点配置如下:
string _sppAPIEndpoint = "https://localhost:44357/api/AAD/secure";
string _graphAPIEndpoint = "https://graph.microsoft.com/v1.0/me";
并且范围设置为访问身份验证:
//Set the scope for API call to user.read
string[] _scopes = new string[] { "user.read" };
因此,当我运行UWP应用程序时,我可以获得auth令牌和图形信息,但是,正如我在开始时所说,当我执行以下命令时,我将获得404:
var httpClient = new System.Net.Http.HttpClient();
var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url);
//Add the token in Authorization header
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
HttpResponseMessage response = await httpClient.GetAsync(url);
对于令牌值,我尝试使用AccessToken和IdpToken,但没有任何效果
我做错了什么?任何提示和指示都将不胜感激。有很多示例,但如果您发现缺少一个,它可能会弹出。 您需要的最接近的是此处: 最后,您必须在“聚合应用程序”部分中至少有两个应用程序,如下所示:
string _sppAPIEndpoint = "https://localhost:44357/api/AAD/secure";
string _graphAPIEndpoint = "https://graph.microsoft.com/v1.0/me";
然后,您需要显式地将UWP应用程序访问扩展到API应用程序。这是通过传递UWP应用程序的客户端ID在API应用程序中完成的:
然后,UWP应用程序将为API创建身份验证请求作为资源,并将接收用于API的访问令牌
如果要获取多资源令牌(要使用Microsoft Graph的令牌和WebAPI的令牌,必须创建多资源请求
您还可以尝试包括您的API范围(查看我的第二个屏幕截图-有API的范围,您可以定义自己的范围)在请求中。astaykov,谢谢。不幸的是,您链接中的代码示例引用的是ADv1 B2B实现,而不是v2。此外,我已经完成了您建议的所有操作:为客户端创建了第二个应用程序注册(尽管所有文档都告诉我们对所有客户端使用一个应用程序注册),并添加了预授权的应用程序条目: 我甚至在我的客户端请求中添加了一个新的作用域,其中包含本机应用程序Id:
”api://436b73b7-8f59-45e7-9449-580fb9a5d90d/access_as_user“
,但当我尝试使用新令牌调用API时,收到UI屏幕上显示的错误消息:
指示客户端能够与给定服务器通信,但服务器找不到请求的内容。
请检查提供相应服务的服务器的URL是否正确。需要检查的一件事是实际的令牌;您可以将令牌粘贴进去,并检查颁发者和授权机构以及预期的受众和范围。这样您就可以检查您收到的令牌是否与您的设置一起工作。@bartbje,我只是是的,按照你的建议,当我将它粘贴到jwt.io中时,我得到了以下信息:有效载荷:数据{“ver”:“2.0”,“iss”:“…”exp:1508352301,“iat”:1508348401,“nbf”:1508348401,“名称”:“Danny Garber”,“首选用户名”:“XXXXX”,“oid”:“XXX”,“tid”:“XXX”,“azp”:“XXX”,“scp”:“作为用户访问”,“azpacr”:“0”,“aio”:“XXX”}因此,在我看来,它似乎是正确的标记,但api调用仍然附带这两个标记404@DannyGarber你解决了这个问题吗?这里的问题完全相同,非常混乱。你在回答中提供的示例代码与我的场景无关。它使用ADAL和AD v1,我使用最新的MSAL和AD v2端点。昨天,我在某种程度上设法让UWP客户端通过身份验证并访问API,但我注意到这样做的一种优势行为。只有当Fiddler应用程序并排运行并捕获HTTPS请求时,这些应用程序才能工作并相互通信。当我停止Fiddler时,我得到了“臭名昭著”的错误,并说:“证书颁发机构无效或不正确。”有什么想法吗?我能够修复错误“证书颁发机构无效或不正确”",通过导出IIS Express开发者证书并将其添加到受信任的根证书颁发机构。但是,我启动此线程的主要问题尚未解决。现在,当我调用API时,我收到了要登录到我的AD租户的HTML内容作为响应。它似乎在API请求中没有看到我的令牌。URL是正确的。如果我从控制器类中删除[Authorize]声明,我可以访问它。我遇到的问题是,如果没有Fiddler应用程序捕获HTTPS请求,我无法访问API。(请参阅下面我的其他评论)