Жетоны на предъявителя JWT w/ ASP.NET идентичность 3


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

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

Хотя код является отличным началом, это не полное решение, которое интегрирует w/ 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 для Проверенный метод. Есть ли лучший способ интегрировать w/ ASP.NET личность?

1 5

1 ответ:

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

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

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