Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.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# 使用OpenIdConnect从Azure Active Directory访问令牌无效_C#_Asp.net_.net Core_Oauth 2.0_Azure Active Directory - Fatal编程技术网

C# 使用OpenIdConnect从Azure Active Directory访问令牌无效

C# 使用OpenIdConnect从Azure Active Directory访问令牌无效,c#,asp.net,.net-core,oauth-2.0,azure-active-directory,C#,Asp.net,.net Core,Oauth 2.0,Azure Active Directory,每次用户通过Azure Active Directory OAuth登录到我的应用程序时,我都希望检查用户的Active Directory组并根据这些组分配角色。我的应用程序正在运行Orchard Core,所以我想使用Orchard的内置AAD身份验证模块 我无法使用任何配置,因此我将整个模块的源代码复制到我的应用程序中,该应用程序使用Orchard作为NuGet包,并手动修改OpenIdConnct配置,以便在发出令牌时添加事件侦听器,然后调用Microsoft Graph API检索组信

每次用户通过Azure Active Directory OAuth登录到我的应用程序时,我都希望检查用户的Active Directory组并根据这些组分配角色。我的应用程序正在运行Orchard Core,所以我想使用Orchard的内置AAD身份验证模块

我无法使用任何配置,因此我将整个模块的源代码复制到我的应用程序中,该应用程序使用Orchard作为NuGet包,并手动修改OpenIdConnct配置,以便在发出令牌时添加事件侦听器,然后调用Microsoft Graph API检索组信息

问题是我收到的令牌看起来是有效的,我已经在jwt.io上检查过了,令牌中的作用域是:scp:offline\u access openid profile User.Read。 但是,当我尝试在Graph API中使用此令牌时,它会以访问令牌丢失或格式不正确的方式响应

我花了很多时间,不知道为什么会这样

我使用的代码如下所示:

options.ClientId = azureADOptions.ClientId;
options.ClientSecret = azureADOptions.ClientSecret;
options.Authority = new Uri(new Uri(azureADOptions.Instance), azureADOptions.TenantId).ToString();
options.CallbackPath = azureADOptions.CallbackPath ?? options.CallbackPath;
options.SignedOutCallbackPath = azureADOptions.SignedOutCallbackPath ?? options.SignedOutCallbackPath;
options.SignInScheme = "Identity.External";

options.Scope.Add("openid");
options.Scope.Add("offline_access");
options.Scope.Add($"api://{azureADOptions.ClientId}");

options.Resource = azureADOptions.ClientId;
options.Scope.Add(HttpUtility.HtmlEncode(GraphService.GraphInstance));
options.ResponseType = OpenIdConnectResponseType.IdTokenToken;

options.Events.OnMessageReceived += context =>
        {
            return Task.CompletedTask;
        };

options.Events.OnTokenResponseReceived += context =>
        {
            return Task.CompletedTask;
        };

options.Events.OnTicketReceived += context =>
        {
            return Task.CompletedTask;
        };
我在事件处理程序中读取了访问令牌,并使用postman调用了Graph API,但失败了


有什么问题吗?

我对orchard不太熟悉,但是你确定你得到的是访问令牌而不是id令牌吗?从我看来,你可能会得到一个身份证代币。。这可以解释失败的原因,
您需要具有作用域的访问令牌才能访问图形。

您不需要调用Microsoft graph API来检索组信息。您只需修改应用程序清单引用中的groupMembershipClaims字段:

groupMembershipClaims:SecurityGroup

然后,令牌将包含使用所属组的ID,如下所示:

{ 分组:[93d96b98-cc9b-410e-a5c8-105883EDXXX] }

然后可以根据代码中的组id查找用户

您还可以定义一些应用程序角色并将角色分配给组。然后,组中的用户将拥有以下声明:

{ 角色:[管理员] }

然后,您可以根据用户的角色实现授权逻辑

有关详细信息,请参阅:

更新:


由于令牌最多只能包含200个组,因此使用此方法要求您的用户所属组少于200个。

请注意,令牌中包含的组有一个最大限制。如果用户的IIRC超过200个组,则令牌中不会有任何组,而必须从MS Graph API查询这些组。@juunas谢谢您的添加,您是对的,我将更新我的答案。谢谢,我在数小时后也计算出了,但不知道限制。但是,我仍然想知道为什么访问令牌不起作用?如果我的答案对您有帮助,您可以接受它作为答案单击答案旁边的复选标记,将其从灰色变为填充。。看见这可能对其他社区成员有益。谢谢。是的,options.ResponseType=OpenIdConnectResponseType.IdTokenToken;选项配置它,我同时获得Id和访问令牌。两者都在jwt.io上有效,但都不能用于图形授权。