在 ASP.NET Core 3 中使用 id_token
Posted
技术标签:
【中文标题】在 ASP.NET Core 3 中使用 id_token【英文标题】:Use id_token with ASP.NET Core 3 【发布时间】:2020-03-13 22:41:37 【问题描述】:在 ASP.NET Core 3 应用程序中,我需要处理来自 id_token
和 access_token
的信息。
id_token
有会员信息,有时需要这些信息来制定政策。由于成员信息可能很大,将其作为access_token
的一部分是不可能的(令牌超过允许的最大大小)。
客户在x-id-token
标头中发送id_token
,我正在寻找一种方法来提取它并使用其中的声明。
现在我已经配置了 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"];
);
...
【问题讨论】:
看起来您需要创建自定义身份验证。请看一个例子***.com/questions/31464359/… @BasilKosovan 感谢您为我指出解决方案。 【参考方案1】:正如问题中所述,我需要在授权流程中执行一个步骤来验证自定义标头中提供的 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)));
);
对我们而言,此政策适用于所有授权端点。
【讨论】:
这绝对是一颗宝石!谢谢!以上是关于在 ASP.NET Core 3 中使用 id_token的主要内容,如果未能解决你的问题,请参考以下文章
将 OpenID Connect 与 .NET Core 3.0 ASP.NET Core API 服务一起使用时出错
Linq 查询在 ASP.NET-Core 3.0 及更高版本中对数字等字符串进行排序
如何在 ASP.NET Core 3.1 中启用多重身份验证?
属性路由在 asp.net core 3.0 中无法正常工作