2

Я пытаюсь настроить аутентификацию на предъявителя для SPA с использованием ASP.NET Core 1.0. Я почти заработал для JwtToken с OpenIdConnect Server, но у меня есть проблема, что мои пользовательские претензии не возвращаются с токеном.ASP.NET Core 1.0. Токеран-носитель, не может получить доступ к пользовательским требованиям

Моя Startup.cs логика для аутентификации заключается в следующем:

private void ConfigureAuthentication(IApplicationBuilder app) 
{ 
    app.UseJwtBearerAuthentication(options => 
    { 
     options.AutomaticAuthenticate = true; 
     options.Authority = "http://localhost:53844"; 
     options.Audience = "http://localhost:53844"; 
     options.RequireHttpsMetadata = false; 
    }); 

    app.UseOpenIdConnectServer(options => 
    { 
     options.TokenEndpointPath = "/api/v1/token"; 
     options.AllowInsecureHttp = true; 
     options.AuthorizationEndpointPath = PathString.Empty; 
     options.Provider = new OpenIdConnectServerProvider 
     { 
      OnValidateClientAuthentication = context => 
      { 
       context.Skipped(); 
       return Task.FromResult<Object>(null); 
      }, 
      OnGrantResourceOwnerCredentials = async context => 
      { 
       var usersService = app.ApplicationServices.GetService<IUsersService>(); 

       User user = usersService.getUser(context.Username, context.Password); 

       var identity = new ClaimsIdentity(new List<Claim>(), OpenIdConnectServerDefaults.AuthenticationScheme); 
       identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())); 
       identity.AddClaim(new Claim(ClaimTypes.Name, user.Id.ToString())); 
       identity.AddClaim(new Claim("myclaim", "4815162342")); 

       var ticket = new AuthenticationTicket(
        new ClaimsPrincipal(identity), 
        new AuthenticationProperties(), 
        context.Options.AuthenticationScheme); 

       ticket.SetResources(new[] { "http://localhost:53844" }); 
       ticket.SetAudiences(new [] {"http://localhost:53844"}); 
       ticket.SetScopes(new [] {"email", "offline_access" }); 
       context.Validated(ticket); 
      } 
     }; 
    }); 
} 

Оба access_token и refresh_token генерируют и успешно при прохождении access_token в авторизации системы заголовка угощения запрос, как уполномоченный.

Единственная проблема заключается в том, что все претензии, кроме NameIdentifier, не передаются.

Я использую следующий код, чтобы получить свои претензии на запрос аутентификации:

public class WebUserContext : IUserContext 
{ 
    private readonly IHttpContextAccessor contextAccessor; 

    public WebUserContext(IHttpContextAccessor contextAccessor) 
    { 
     this.contextAccessor = contextAccessor; 
    } 

    public long UserId 
    { 
     get 
     { 
      ClaimsIdentity identity = Principal?.Identity as ClaimsIdentity; 

      if (identity == null) 
      { 
       return -1; 
      } 

      Claim claim = identity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name); // There is no such claim in claims collection 
      return long.Parse(claim.Value); 
     } 
    } 

    private ClaimsPrincipal Principal => contextAccessor.HttpContext.User as ClaimsPrincipal; 
} 

Что может быть причиной моих претензии не передаются или извлекаются из маркеров?

ответ

2

Какова может быть причина, по которой мои претензии не передаются или не извлекаются из токена?

Безопасность.

В отличие от OAuthAuthorizationServerMiddleware, ASOS не предполагает, что токены доступа всегда потребляются собственными серверами ресурсов (хотя я согласен с тем, что это обычный сценарий) и отказывается сериализовать претензии, которые явно не указывают «пункт назначения», чтобы избежать утечки конфиденциальной информации данные несанкционированным сторонам.

С JWT, являющимся форматом по умолчанию в ASOS beta4 (but not in the next beta), вы также должны иметь в виду, что даже клиентские приложения (или пользователи) могут читать ваши токены доступа.

По этой причине, вы должны явно прикрепить «цели» к вашим претензиям:

identity.AddClaim(ClaimTypes.Name, "Pinpoint", destination: "id_token token"); 

Укажите id_token сериализовать претензию в знак идентичности, token сериализовать его в маркер доступа или как сериализовать это в обоих токенах (нет эквивалента для кодов авторизации или токенов обновления, поскольку они всегда зашифрованы и могут быть прочитаны только самим сервером авторизации)

+0

@ lostaman У вас есть шанс подтвердить, что настройка адресата сработала? – Pinpoint

+0

могу подтвердить. Он работает с «access_token». –

 Смежные вопросы

  • Нет связанных вопросов^_^