C# ASP.NET核心AWS Cognito JWT

C# ASP.NET核心AWS Cognito JWT,c#,asp.net-web-api,jwt,asp.net-core-webapi,aws-cognito,C#,Asp.net Web Api,Jwt,Asp.net Core Webapi,Aws Cognito,在ASP.NET Core中,当JWT令牌传递不同的声明时,如何标准化可用的用户信息AuthorizationHandlerContext.user AWS Congito有两种令牌类型:访问令牌和id令牌。 Id令牌包含对名字、姓氏、帐户Id、电子邮件等的声明,而其访问令牌仅包含帐户Id声明 如何创建get根据令牌类型填充的通用用户对象 可用ID令牌声明 AccountId、姓氏、姓氏、电子邮件、电话 可用访问令牌声明 帐户ID 现在,在我的应用程序的其他地方,我需要获取当前用户的名字。ID令

在ASP.NET Core中,当JWT令牌传递不同的声明时,如何标准化可用的用户信息AuthorizationHandlerContext.user

AWS Congito有两种令牌类型:访问令牌和id令牌。 Id令牌包含对名字、姓氏、帐户Id、电子邮件等的声明,而其访问令牌仅包含帐户Id声明

如何创建get根据令牌类型填充的通用用户对象

可用ID令牌声明 AccountId、姓氏、姓氏、电子邮件、电话

可用访问令牌声明 帐户ID

现在,在我的应用程序的其他地方,我需要获取当前用户的名字。ID令牌没有问题,因为它已经可用,但我需要能够在发送访问令牌时转到我的DB获取用户的名字、姓氏、电子邮件和电话

我尝试创建自己的用户对象,该对象在DI容器中注册,但IHttpContextAccessor传递的标识未经身份验证,因此此时没有可用的声明

//Startup.cs
public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options => {
        options.DefaultAuthenticationScheme = JwtBearerDefault.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options => {
       //Omitted for brevity
    });

    services.AddAuthorization(options => {
        //Omitted for brevity
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();
}

//MyUser.cs
//How can this class's properties be set depending on the access token type?
//IE set by the claims available in the ID token, but send by a DB query when the an access token is used.
class MyUser : IMyUser
{
     public int AccountId {get;set;}
     public string FirstName {get;set;}
     public string LastName {get;set;}
}

//MyService.cs
class MyService
{
    private IMyUser _user;

    public MyService(IMyUser user)
    {
        _user = user;
    }

    public MyMethod()
    {
       //Do something with _user.FirstName, _user.LastName
    }
}

//I tried passing IHttpContextAccessor as a constructor param in MyUser
//but context.User.Identity.Claims.Count = 0 and context.User.Identity.IsAuthenticated = false
//MyUser.cs
public MyUser(IHttpContextAccessor context){
    //context.User.Identity.IsAuthenticated == false
    //context.User.Identity.Claims.Count == 0
    //context.User.Identity.Name == null
}

如果您使用Amazon.Lambda.AspNetCoreServer,您只需要在API网关中将cognito配置为身份验证,然后您就可以通过以下方式访问声明:

var claim = Request.HttpContext.User.Claims.First(x=>x.Type =="Foo").Value;