OpenID 连接身份验证中的 ValidateIssuer 选项

rah*_*dev 6 c# azure-active-directory openid-connect

我们正在使用 OIDC 库,目前我们仅允许 MSA 帐户登录。因此,我们已经配置了参数ValidateIssuer = trueValidissuers = https://login.microsoftonline.com/..\xe2\x80\x9d 但是,我们现在需要将其他 AAD 租户(例如:abc@dell.com)加入我们的应用程序,因此我们决定设置ValidateIssuer = false.

\n\n

由于我的应用程序已经由自定义授权支持,因此我发现很难完全理解该标志的用途。基本上我的问题是在什么情况下人们不想将此标志设置为 false ?如果设置为 false 可能会遇到什么风险?

\n\n

我查看了此处发布的 AAD 文档,但仍然无法从示例代码片段的评论中找到令人信服的响应:

\n\n
        // ValidateIssuer set to false to allow work accounts from any organization to sign in to your application\n        // To only allow users from a single organizations, set ValidateIssuer to true and \'tenant\' setting in web.config to the tenant name or Id (example: contoso.onmicrosoft.com)\n        // To allow users from only a list of specific organizations, set ValidateIssuer to true and use ValidIssuers parameter\n        TokenValidationParameters = new TokenValidationParameters()\n        {\n            ValidateIssuer = false\n        },\n
Run Code Online (Sandbox Code Playgroud)\n

Roh*_*gal 13

正如已经提到的另一个答案,如果您离开ValidateIssuer = false,那么 OIDC 中间件将不会尝试验证颁发者租户,这实际上意味着您的应用程序对 Azure AD 中拥有用户的任何人开放。

关于解决多租户案例的一些建议

  1. 如果您提前知道有效发行人的列表,请使用 中的发行人列表TokenValidationParameters.ValidIssuers。例子:

      ValidIssuers = new List<string>()
      {
          "https://sts.windows.net/6d9c0c36-c30e-442b-b60a-ca22d8994d14/",
          "https://sts.windows.net/f69b5f46-9a0d-4a5c-9e25-54e42bbbd4c3/",
          "https://sts.windows.net/fb674642-8965-493d-beee-2703caa74f9a/"
      }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您的应用程序的有效颁发者是动态的,或者您想要编写一些逻辑来收集该列表,您可以编写一个TokenValidationParameters.IssuerValidator具有自定义逻辑的实现。您只需要设置一个用于验证发行者的委托。

        TokenValidationParameters validationParameters = new TokenValidationParameters
        {            
            ValidateIssuer = true,
    
            // Set this to a delegate and write your own custom implementation there. See code sample URL ahead for more details.
            IssuerValidator = AadIssuerValidator.ValidateAadIssuer
        };
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果两种情况都没有意义,并且您的验证逻辑与调用者所属的租户无关,请设置TokenValidationParameters.ValidateIssuer为 false,但请确保在末尾添加自定义逻辑,例如在SecurityTokenValidated通知中。

示例代码

使用 Azure AD 和 OpenID Connect 构建多租户 SaaS Web 应用程序

仔细查看此示例中的这些文件: