C# 将id_令牌与ASP.NET Core 3一起使用

C# 将id_令牌与ASP.NET Core 3一起使用,c#,asp.net-core,.net-core,asp.net-core-mvc,jwt,C#,Asp.net Core,.net Core,Asp.net Core Mvc,Jwt,在ASP.NET Core 3应用程序中,我需要处理来自id\u令牌以及access\u令牌的信息 id\u令牌具有成员身份信息,有时需要这些信息来构建策略。由于成员资格信息可能很大,因此不可能将其作为access\u令牌的一部分(令牌超过了允许的最大大小) 客户端在x-id-token头中发送id\u令牌,我正在寻找一种方法来提取它并在其中使用声明 现在我已经配置了JwtBearer auth,它可以与授权:Bearer access\u token头无缝地工作 public void配置服务

在ASP.NET Core 3应用程序中,我需要处理来自
id\u令牌
以及
access\u令牌
的信息

id\u令牌
具有成员身份信息,有时需要这些信息来构建策略。由于成员资格信息可能很大,因此不可能将其作为
access\u令牌的一部分(令牌超过了允许的最大大小)

客户端在
x-id-token
头中发送
id\u令牌
,我正在寻找一种方法来提取它并在其中使用声明

现在我已经配置了JwtBearer auth,它可以与
授权:Bearer access\u token
头无缝地工作

public void配置服务(IServiceCollection服务){
services.AddAuthentication(选项=>
{
options.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(选项=>
{
options.Authority=$“https://{Configuration[“auth:Domain”]}/”;
options.Audience=Configuration[“auth:Audience”];
});
...
}

如问题中所述,我需要授权流程中的一个步骤来验证自定义标题中提供的
id\u令牌和
membership\u id
。我最终创建了一个自定义的auth需求处理程序,格式如下

内部类成员资格要求:AuthorizationHandler,IAAuthorizationRequirement
{
公共成员资格要求(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
受保护的覆盖任务HandleRequirementAsync(授权HandlerContext上下文,成员资格要求)
{
var authFilterCtx=(Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
字符串idToken=authFilterCtx.HttpContext.Request.Headers[“x-id-token”];
字符串membershipId=authFilterCtx.HttpContext.Request.Headers[“x-selected-membership-id”];
if(idToken!=null&&membershipId!=null)
{
var identity=ValidateIdToken(idToken).Result;
如果(标识!=null)
{
var subscriptions=identity.Claims.ToList().FindAll(s=>s.Type==”https://example.com/subs)。ToList();
var assignments=subscriptions.Select(s=>JsonSerializer.Deserialize(s.Value)).ToList();
var membership=assignments.Find(a=>a.id==membershipId);
if(成员资格!=null)
{
//将id令牌声明分配给用户标识
context.User.AddIdentity(新的ClaimsIdentity(identity.Claims));
成功(要求);
}
else{context.Fail();}
}
其他的
{
context.Fail();
}
}
返回Task.FromResult(空);
}
专用异步任务验证令牌(字符串令牌)
{
尝试
{
IConfigurationManager configurationManager=new configurationManager($“https://{Configuration[“Auth:Domain”]}/.well-known/openid配置”,new-OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration openIdConfig=await configurationManager.GetConfigurationAsync(CancellationToken.None);
令牌验证参数验证参数=
新的TokenValidationParameters
{
IssuerSigningKeys=openIdConfig.SigningKeys,
validateisuer=false,
ValidateAudience=false
};
var validator=新的JwtSecurityTokenHandler();
SecurityToken validatedToken;
var identity=validator.ValidateToken(令牌、validationParameters、out validatedToken);
返回身份;
}
捕获(例外e)
{
Writeline($”验证令牌时出错:{e.Message}”);
返回null;
}
}
}
内部类订阅
{
公共字符串名称{get;set;}
公共字符串id{get;set;}
}
然后在
public void ConfigureServices(IServiceCollection services)
方法中添加了一个策略来检查
id\u令牌中的成员身份

services.AddAuthorization(选项=>
{
options.AddPolicy(“RequiredCompanyMembership”,policy=>policy.Requirements.Add(新成员资格要求(配置));
});

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

看起来您需要创建自定义身份验证。请看一个例子@basilkosvan谢谢你给我指点解决方案。这绝对是一块宝石!非常感谢。