ASP.NET Core AWS Cognito JWT - PullRequest
0 голосов
/ 04 мая 2018

Как в ASP.NET Core можно стандартизировать доступную пользовательскую информацию AuthorizationHandlerContext.User, когда токены JWT передают разные утверждения?

AWS Congito имеет два типа токенов: токены доступа и токены id. Токены Id содержат заявки на имя, фамилию, Id учетной записи, адрес электронной почты и т. Д., А токен доступа содержит только заявку Id учетной записи.

Как я могу создать универсальный объект User, который заполняется в зависимости от типа токена?

Доступен идентификатор токена заявок AccountId, FirstName, LastName, E-mail, Телефон

Заявки на доступный токен AccountId

Теперь где-то еще в моем приложении мне нужно получить имя текущего пользователя. Это не проблема с токеном ID, потому что он уже доступен, но мне нужно иметь возможность зайти в мою БД, чтобы получить имя пользователя, фамилию, адрес электронной почты и телефон при отправке токена доступа.

Я попытался создать свой собственный пользовательский объект, который зарегистрирован в контейнере 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
}

1 Ответ

0 голосов
/ 04 мая 2018

Если вы используете Amazon.Lambda.AspNetCoreServer, вам нужно только сконфигурировать cognito как аутентификацию в API Gateway, а затем вы можете получить доступ к заявке:

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