5

На основе отличного примера от Шона Луттина по адресу https://stackoverflow.com/a/30857524 Я смог использовать этот код для генерации и потребления токенов-носителей. Незначительные изменения должны были получить последние версии пакетов:Знаки жетонов JWT с идентификаторами ASP.NET 3

"dependencies": { 
    "Microsoft.AspNet.Authentication.JwtBearer": "1.0.0-rc1-final", 
    "AspNet.Security.OpenIdConnect.Server": "1.0.0-beta4" 
} 

Хотя код является отличным началом, это не полное решение, которое интегрируется ж/ASP.NET Идентичность полностью. Я изменил класс AuthorizationProvider следующим образом:

public override Task GrantResourceOwnerCredentials(
    GrantResourceOwnerCredentialsContext context) 
{ 
    var user = _userManager.FindByNameAsync(context.UserName).Result; 
    if (user == null) 
    { 
     context.Rejected("The user name or password is incorrect."); 
    } 
    else 
    { 
     var signInManager = context.HttpContext.RequestServices 
      .GetRequiredService<SignInManager<ApplicationUser>>(); 

     if (signInManager.CanSignInAsync(user).Result && 
      _userManager.CheckPasswordAsync(user, context.Password).Result) 
     { 
      var principal = signInManager.CreateUserPrincipalAsync(user).Result; 

      //To avoid leaking confidential data, AspNet.Security.OpenIdConnect.Server 
      //refuses to serialize the claims that don't explicitly specify a destination. 
      foreach (var claim in principal.Claims) 
       claim.WithDestination("token id_token"); 

      context.Validated(principal); 
     } 
     else 
      context.Rejected("The user name or password is incorrect."); 
    } 

    return Task.FromResult(0); 
} 

Я использую CreateUserPrincipalAsync создать ClaimsPrincipal для метода Validated. Есть ли лучший способ интеграции w/ASP.NET Identity?

+0

Любые обновления по этому вопросу? Я не могу получить 'signInManager', а не' _userManager. Может быть, их вводят? – Lars

ответ

2

Ваша реализация выглядит хорошо, незначительные 3 замечания:

  • Вы должны использовать async/await избежать .Result блокировки вызовов.
  • Вы должны рассмотреть возможность применения контрмер для грубой силы, как того требуют спецификации OAuth2: https://tools.ietf.org/html/rfc6749#section-4.3.2. Это то, что вы можете легко сделать с Identity 3, поскольку он предлагает встроенную поддержку «блокировки».
  • Вы должны иметь в виду, что эта реализация приведет к сериализации всех претензий (даже пользовательских), связанных с пользователем, которые могут включать конфиденциальные данные.

Последние два пункта смягчаются в OpenIddict (совершенно новый экспериментальный сервер РСИН, который использует AspNet.Security.OpenIdConnect.Server внутри), так что не стесняйтесь, чтобы взглянуть на его реализацию по умолчанию: https://github.com/openiddict/core/blob/dev/src/OpenIddict.Core/OpenIddictProvider.cs#L353.

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