c# - 在 ASP.NET Core 3 中使用 id_token

标签 c# asp.net-core .net-core asp.net-core-mvc jwt

在 ASP.NET Core 3 应用程序中,我需要处理来自 id_token 的信息连同 access_token .
id_token具有有时需要建立策略的成员信息。由于成员(member)信息可能很大,因此成为access_token 的一部分。不可能( token 超过最大允许大小)。

客户发送 id_tokenx-id-token header,我正在寻找一种方法来提取它并使用其中的声明。

现在我已经配置了 JwtBearer 身份验证,它可以与 Authorization: Bearer access_token 无缝协作。标题。

public void ConfigureServices(IServiceCollection services) {
      services.AddAuthentication(options =>
      {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
      })
      .AddJwtBearer(options =>
      {
        options.Authority = $"https://{Configuration["auth:Domain"]}/";
        options.Audience = Configuration["auth:Audience"];
      });
...
}

最佳答案

正如问题中所述,我需要授权流程中的一个步骤来验证 id_token和一个 membership_id在自定义标题中提供。我最终以以下形式创建了一个自定义身份验证要求处理程序

  internal class MembershipRequirement : AuthorizationHandler<MembershipRequirement>, IAuthorizationRequirement
  {
    public MembershipRequirement(IConfiguration configuration)
    {
      Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MembershipRequirement requirement)
    {
      var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
      string idToken = authFilterCtx.HttpContext.Request.Headers["x-id-token"];
      string membershipId = authFilterCtx.HttpContext.Request.Headers["x-selected-membership-id"];

      if (idToken != null && membershipId != null)
      {
        var identity = ValidateIdToken(idToken).Result;

        if (identity != null)
        {
          var subscriptions = identity.Claims.ToList().FindAll(s => s.Type == "https://example.com/subs").ToList();
          var assignments = subscriptions.Select(s => JsonSerializer.Deserialize<Subscription>(s.Value)).ToList();

          var membership = assignments.Find(a => a.id == membershipId);

          if (membership != null)
          {
            // assign the id token claims to user identity
            context.User.AddIdentity(new ClaimsIdentity(identity.Claims));

            context.Succeed(requirement);
          }
          else { context.Fail(); }
        }
        else
        {
          context.Fail();
        }
      }

      return Task.FromResult<object>(null);
    }

    private async Task<ClaimsPrincipal> ValidateIdToken(string token)
    {
      try
      {
        IConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>($"https://{Configuration["Auth:Domain"]}/.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());
        OpenIdConnectConfiguration openIdConfig = await configurationManager.GetConfigurationAsync(CancellationToken.None);

        TokenValidationParameters validationParameters =
                      new TokenValidationParameters
                      {
                        IssuerSigningKeys = openIdConfig.SigningKeys,
                        ValidateIssuer = false,
                        ValidateAudience = false
                      };

        var validator = new JwtSecurityTokenHandler();
        SecurityToken validatedToken;
        var identity = validator.ValidateToken(token, validationParameters, out validatedToken);

        return identity;

      }
      catch (Exception e)
      {
        Console.Writeline($"Error occurred while validating token: {e.Message}");
        return null;
      }
    }
  }

  internal class Subscription
  {
    public string name { get; set; }
    public string id { get; set; }
  }

然后在 public void ConfigureServices(IServiceCollection services)方法添加了一个策略来检查 id_token 中的成员资格

      services.AddAuthorization(options =>
      {
        options.AddPolicy("RequiredCompanyMembership", policy => policy.Requirements.Add(new MembershipRequirement(Configuration)));
      });

对我们而言,此策略全局应用于所有授权端点。

关于c# - 在 ASP.NET Core 3 中使用 id_token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58916645/

相关文章:

c# - 指定从 ASP.NET Core WebApi 提供服务的 Angular ClientApp 的基本 URL

.net-core - 带有 JWT 的 Core 2.0 API Auth 返回未经授权

asp.net-core - 来自 ASP.NET Core API 的 JSON 响应中缺少派生类型的属性

c# - 在 Framework 4.6 项目中使用 .net core DLL

c# - 如何使用商店证书为 NET Core 2.1 正确设置 HTTPS

c# - SqlDependency notification - 执行查询后立即失败通知

c# - 警告尝试构建 Service Fabric AspNetCore2 项目

c# - ASP.NET Core 没有用 StructureMap 替换 IoC

c# - 移动图片框 C#

c# - 识别来电号码。最简单的方法是什么?