自定义在 2016 或更高版本id_token OpenID 连接或 OAuth 时AD FS发出的声明

概述

本文演示如何生成使用 OpenID AD FS登录连接应用。 但是,默认情况下,只有一组固定的声明可用于id_token。 AD FS 2016 及更高版本能够自定义 OpenID id_token方案中连接应用。

何时使用自定义 ID 令牌?

在某些情况下,客户端应用程序可能没有它尝试访问的资源。 因此,它实际上不需要访问令牌。 在这种情况下,客户端应用程序实际上只需要 ID 令牌,但还需要一些额外的声明来帮助实现功能。

在 ID 令牌中获取自定义声明的限制是什么?

方案 1

Screenshot showing Scenario 1 which is using relying party I D to equal client I D.

  1. response_mode 设置为 form_post
  2. 只有公共客户端才能获取 ID 令牌中的自定义声明
  3. Web API 标识符 (信赖方) 标识符应与客户端标识符相同

方案 2

Screenshot showing Scenario 2 which is using allatclaims scope.

客户端服务器上安装了 KB4019472 或更高版本AD FS更新

  1. response_mode 设置为 form_post
  2. 公共客户端和机密客户端都可以在 ID 令牌中获取自定义声明
  3. 将范围 allatclaims 分配给客户端 – RP 对。

可以使用 cmdlet 分配范围 Grant-ADFSApplicationPermission ,如以下示例所示:

Grant-AdfsApplicationPermission -ClientRoleIdentifier "https://my/privateclient" -ServerRoleIdentifier "https://rp/fedpassive" -ScopeNames "allatclaims","openid"

创建和配置 OAuth 应用程序以处理 ID 令牌中的自定义声明

按照以下步骤在应用程序中创建和配置应用程序AD FS自定义声明接收 ID 令牌。

在 2016 或更高版本AD FS和配置应用程序组

  1. 在AD FS管理"中,右键单击"应用程序组",然后选择"添加应用程序组"。

  2. 在应用程序组向导中,输入 ADFSSSO 作为名称,Client-Server应用程序下选择访问 Web 应用程序 模板的本机应用程序。 单击“下一步” 。

    Screenshot of the Welcome page of the Add Application Group Wizard.

  3. 复制“客户端标识符”值。 稍后,它将用作应用程序中 ida:ClientId 的值web.config文件。

  4. 为"重定向URI"输入以下内容https://localhost:44320/ :。 单击“添加”。 单击“下一步” 。

    Screenshot of the Native application page of the Add Application Group Wizard showing the redirect U R I .

  5. 在"配置 Web API"屏幕上,为"标识符"输入以下内容 。 单击“添加”。 单击“下一步”。 稍后,此值将用于应用程序中的 ida:ResourceID web.config文件。

    Screenshot of the Configure Web API page of the Add Application Group Wizard showing the correct identifier.

  6. 在"选择访问控制策略"屏幕上,选择"允许所有人",然后单击"下一步"。

    Screenshot of the Choose Access Control Policy page of the Add Application Group Wizard showing the Permit everyone option highlighted.

  7. 在"配置应用程序权限"屏幕上,确保已选择"openid""allatclaims",然后单击"下一步"。

    Screenshot of the Configure Application Permissions page of the Add Application Group Wizard.

  8. 在"摘要"屏幕上,单击"下一步"。

    Screenshot of the Summary page of the Add Application Group Wizard.

  9. 在"完成"屏幕上,单击"关闭"。

  10. 在AD FS管理"中,单击"应用程序组"获取所有应用程序组的列表。 右键单击"ADFSSSO",然后选择"属性"。 选择 "ADFSSSO - Web API",然后单击 "编辑 ..."

    Screenshot of the A D F S S O Properties dialog box showing the Web API listed in the Applications section.

  11. "ADFSSSO - Web API 属性" 屏幕上,选择" 颁发转换规则" 选项卡,然后单击" 添加规则..."

    Screenshot of the A D F S S O Properties dialog box Showing the Issuance Transform Rules tab.

  12. "添加转换声明规则向导"屏幕上,从下拉列表中选择"使用自定义规则发送声明",然后单击"下一步"

    Screenshot of the Select Rule Template page of the Add Transform Claim Rule Wizard showing the Send Claims Using a Custom Rule option selected.

  13. 在"添加转换声明规则向导"屏幕上,在"声明规则名称"中输入ForCustomIDToken,在"自定义规则"中输入以下声明规则。 单击“完成”

    x:[]
    => issue(claim=x);
    

    Screenshot of the Configure Rule page of the Add Transform Claim Rule Wizard showing the Claim rule name and Custom rule text fields populated.

    注意

    还可使用 PowerShell 分配 allatclaimsopenid 范围。

    Grant-AdfsApplicationPermission -ClientRoleIdentifier "[Client ID from #3 above]" -ServerRoleIdentifier "[Identifier from #5 above]" -ScopeNames "allatclaims","openid"
    

下载并修改示例应用程序,以在 id_token

本部分讨论如何下载示例 Web 应用,以及如何在 Visual Studio。 我们将使用位于 此处Azure AD示例。

若要下载示例项目,请使用 Git Bash 并键入以下内容:

git clone https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/1-WebApp-OIDC

Screenshot of the Git Bash window showing the results of the git clone command.

修改应用

  1. 使用 Visual Studio。

  2. 重新生成应用,以便还原所有缺少NuGet包。

  3. 打开web.config文件。 修改以下值,使 如下所示:

    <add key="ida:ClientId" value="[Replace this Client Id from #3 above under section Create and configure an Application Group in AD FS 2016 or later]" />
    <add key="ida:ResourceID" value="[Replace this with the Web API Identifier from #5 above]"  />
    <add key="ida:ADFSDiscoveryDoc" value="https://[Your AD FS hostname]/adfs/.well-known/openid-configuration" />
    <!--<add key="ida:Tenant" value="[Enter tenant name, e.g. contoso.onmicrosoft.com]" />
    <add key="ida:AADInstance" value="https://login.microsoftonline.com/{0}" />-->
    <add key="ida:PostLogoutRedirectUri" value="[Replace this with the Redirect URI from #4 above]" />
    

    Screenshot of the web config file showing the modified values.

  4. 打开 Startup.Auth.cs 文件并做出以下更改:

    • 通过以下更改连接中间件初始化逻辑调整 OpenId:

      private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
      //private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
      //private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
      private static string metadataAddress = ConfigurationManager.AppSettings["ida:ADFSDiscoveryDoc"];
      private static string resourceId = ConfigurationManager.AppSettings["ida:ResourceID"];
      private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
      
    • 注释掉以下内容:

      //string Authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
      

      Screenshot of the Start up Auth file showing the commented out lines of code.

    • 进一步向下修改 OpenId 连接中间件选项,如下所示:

      app.UseOpenIdConnectAuthentication(
           new OpenIdConnectAuthenticationOptions
           {
               ClientId = clientId,
               //Authority = authority,
               Resource = resourceId,
               MetadataAddress = metadataAddress,
               PostLogoutRedirectUri = postLogoutRedirectUri,
               RedirectUri = postLogoutRedirectUri
      

      Screenshot of the Start up Auth file showing the modified Open I D Connect middleware options.

  5. 打开 HomeController.cs 文件并做出以下更改:

    • 添加以下内容:

      using System.Security.Claims;
      
    • 更新 About() 方法,如下所示:

      [Authorize]
      public ActionResult About()
      {
           ClaimsPrincipal cp = ClaimsPrincipal.Current;
           string userName = cp.FindFirst(ClaimTypes.WindowsAccountName).Value;
           ViewBag.Message = String.Format("Hello {0}!", userName);
           return View();
      }
      

      Screenshot of the Home Controller file with the requred updates.

在 ID 令牌中测试自定义声明

进行上述更改后,点击 F5。 此时会打开示例页。 单击"登录"。

Screenshot of the sample app displayed in a browser.

你将被重定向到AD FS登录页。 继续登录。

Screenshot of the A D F S Sign in page.

此操作成功后,应会看到现已登录。

Screenshot of the sample app showing that the user is signed in.

单击“关于”链接。 你将看到从 ID 令牌中的用户名声明检索到的"Hello [Username]"

Screenshot of the About page in the sample app.

后续步骤

AD FS 开发