当前位置: 首页 > 知识库问答 >
问题:

Azure身份:自定义令牌验证以验证多租户应用程序中的发行者

郎思远
2023-03-14

我按照微软的文章实现了我自己的发行者验证(“定制令牌验证”是这一节的标题)。

这似乎适用于仅在应用程序上下文中发布的JWT令牌,但是当对我的API的第一次调用是通过用户委托发布的JWT令牌时就失败了。

我发现这行代码导致了问题:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApi(Configuration);
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
  var existingOnTokenValidatedHandler = options.Events.OnTokenValidated;
  options.Events.OnTokenValidated = async context =>
  {
       await existingOnTokenValidatedHandler(context);
      // Your code to add extra configuration that will be executed after the current event implementation.
      options.TokenValidationParameters.ValidIssuers = new[] { /* list of valid issuers */ };
      options.TokenValidationParameters.ValidAudiences = new[] { /* list of valid audiences */};
  }
});

这是我上面发布的链接中的原始代码。我通过以下方式实现了自己的发行人验证:

        services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
        {                
            var existingOnTokenValidatedHandler = options.Events.OnTokenValidated;
            options.TokenValidtionParameters.RoleClaimType = "roles";
            options.Events.OnTokenValidated = async context =>
            {
                await existingOnTokenValidatedHandler(context);
                options.Authority = "https://login.microsoftonline.com/common";
                var validTenants = FileTenantStore.Tenants.Select(x => x.AzureAdTenantId).ToList();
                options.TokenValidationParameters.ValidIssuers = GetValidIssuers(validTenants);
                options.TokenValidationParameters.IssuerValidator = ValidateIssuers;
            };
        });

我有一个多租户应用,所以我只需要让一些租户通过并拒绝最多。

这个解决方案的行为有点奇怪:

  • 使用仅限应用的令牌调用 API 始终有效。
  • 使用委托令牌调用 API 失败,并显示以下错误消息,甚至不会跳转到回调:

无法验证令牌。Microsoft.IdentityModel.Tokens.SecurityTokenInvalidIssuerException: IDW10303: Issuer: 'https://login.microsoftonline.com/{OUR_TENANT_ID}/v2.0' 与为此应用程序提供的任何有效颁发者都不匹配。at Microsoft.Identity.Web.Resource.AadIssuerValidator.Validate(String actualIssuer, SecurityToken securityToken, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateIssuer(String issuer, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParametersvalidationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken

所以在这种情况下,永远不会调用“OnTokenVal的”。

  • 第一次使用仅限应用程序令牌调用API,然后使用委托令牌调用API可以正常工作。

我可以通过将“OnTokenValidated”-回调中的行移动到上方一级来解决此问题:

        services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
        {                
            var existingOnTokenValidatedHandler = options.Events.OnTokenValidated;

            options.TokenValidationParameters.RoleClaimType = "roles";
            var validTenants = FileTenantStore.Tenants.Select(x => x.AzureAdTenantId).ToList();
            options.TokenValidationParameters.ValidIssuers = GetValidIssuers(validTenants);
            options.TokenValidationParameters.IssuerValidator = ValidateIssuers;
            options.Events.OnTokenValidated = async context =>
            {                  
                await existingOnTokenValidatedHandler(context);
                options.Authority = "https://login.microsoftonline.com/common";

            };
        });

我现在甚至可以删除回调“OnTokenValidated”,但这感觉不对,因为微软的文章给出了明确的说明
我可以这样做吗,或者我的解决方案是安全问题吗?

共有1个答案

杨志强
2023-03-14

如果你在netcore

根据您的代码

services.AddMicrosoftIdentityWebApiAuthentication(Configuration,
    jwtBearerScheme: JwtBearerDefaults.AuthenticationScheme,
    subscribeToJwtBearerMiddlewareDiagnosticsEvents: true);
 类似资料:
  • 在我的网络项目中,我想让用户使用用户名/密码和微软帐户登录。技术-堆栈: Asp.网络核心 角 Azure应用服务 首先,我创建了用户名/密码登录。这样地: 启动。反恐精英: 登录方式: 并通过[授权]保护我的api enpoints。到现在为止,一直都还不错。。。这很有效。 现在我想添加一个登录方法与Microsoft帐户。我使用Azure应用服务身份验证/授权(https://docs.mic

  • 我正在尝试使用Azure VM连接器来启动和停止虚拟机。当我编辑逻辑应用程序时,它使用我的用户Id进行身份验证(成功)。但是,我的用户Id与VM位于不同的租户中。启动虚拟机连接器允许您指定SubscriptionId、ResourceGroup和VM名称,但不能指定租户ID。当我尝试运行Logic应用程序时,我收到一个授权(401)错误(InvalidAuthenticationTokenTena

  • 于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,

  • 我已配置Identity Server 4并使用Azure AD身份验证。如果我在身份服务器中使用租户特定的授权URL,一切都可以正常工作。这样,只有该租户的用户才能登录。我希望允许多个域登录,并希望在后端验证发行者。 为了支持这一点,我需要使用Azure AD的通用登录endpoint,在我登录后,当它重定向到Identity Server的登录endpoint时,我收到以下错误。我应该做什么配

  • 我需要保护我的spring boot应用程序,这是我所拥有的: null 我知道spring boot的web安全特性,但是没有足够的信息来说明如何与自定义令牌一起使用这些特性。

  • 我目前有一个使用Azure移动应用程序的后端解决方案。我已经启用了facebook、twitter、google和Microsoft登录。除此之外,我正在尝试添加一个自定义登录流。我已经设置了一个Auth0帐户和应用程序,当我在应用程序中使用auth0 lock小部件发出请求时,我能够从auth0获得令牌和配置文件。 我遵循了本指南:https://shellmonger.com/2016/04/