Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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 v2.0进行安全保护时,在[Authorize]修饰的Web API方法上获取404_C#_Asp.net_Azure_Core - Fatal编程技术网

C# 使用Azure AD v2.0进行安全保护时,在[Authorize]修饰的Web API方法上获取404

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

在我的场景中,我有一个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包含以下部分:

        // 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。(请参阅下面我的其他评论)