Используйте JWT с аутентификацией OAuth в .Net-Core - PullRequest
0 голосов
/ 31 января 2019

У меня есть пользовательская реализация .AddOAuth() в .Net-Core.Я создал пакет nuget для аутентификации с использованием Coinbase (который по сути является клоном реализации add google и нескольких пользовательских опций, специфичных для coinbase) полный исходный код .Я рассмотрел несколько других вопросов по этому вопросу, однако они, кажется, не реализуют OAuth (например, я не могу передать области). Я хотел бы войти в систему с помощью OAuth, но я хочу вернуть своим клиентам JWT,

Когда я пытаюсь использовать JWT с AddCoinbase (что является производным от AddOAuth)

services.AddAuthentication(JWT_BEARER_AUTH)
.AddJwtBearer(cfg =>
{
    cfg.RequireHttpsMetadata = false;
    cfg.SaveToken = true;

    cfg.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidIssuer = Configuration["Tokens:Issuer"],
        ValidAudience = Configuration["Tokens:Issuer"],
        //TODO: get key from secret section
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"]))
     };
 })
 .AddCoinbase(options => {
     options.AccessAllAccounts = true;
     options.SendLimitAmount = 1;
     options.SendLimitCurrency = "USD";
     options.SendLimitPeriod = SendLimitPeriod.day;
     options.ClientId = Configuration["Coinbase:ClientId"];
     options.ClientSecret = Configuration["Coinbase:ClientSecret"];
     COINBASE_SCOPES.ForEach(scope => options.Scope.Add(scope));
     options.SaveTokens = true;
     options.ClaimActions.MapJsonKey("urn:coinbase:avatar", "avatar_url");
 });

После того, как я войду в систему на основе базы, внешний обратный вызов перенаправит меня

[HttpGet("ExternalLoginCallback")]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
    if (remoteError != null)
    {
        //TODO: Handle remote error failure
        throw new Exception($"Error from external provider: {remoteError}");            
    }
    var info = await _signInManager.GetExternalLoginInfoAsync();
    if (info == null)
    {
        //TODO: Handle null external login info
        throw new Exception("Error: could not find user info");
    }

    // Sign in the user with this external login provider if the user already has a login.
    var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);1

    var user = await (result.Succeeded ?
            _userManager.FindByLoginAsync(info.LoginProvider, info.ProviderKey)
        : this.CreateIdentityUser(info));

     await _signInManager.UpdateExternalAuthenticationTokensAsync(info);
    _logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);

    return Redirect(returnUrl);
}

После перенаправления я никогда не получаю JSON Web Token, я всегда получаю Cookie.Как я могу использовать аутентификацию OAuth при обслуживании JWT для моих клиентов?

1 Ответ

0 голосов
/ 31 января 2019

OAuth не является решением Json Web Token.OAuth 2.0 обеспечивает авторизацию и опциональную идентификацию (OIDC).

Когда вы авторизуетесь через конечную точку OAuth 2.0, вы получаете токен доступа и опционально идентификационный токен.Идентификационный токен является подписанным JWT.Токен доступа - это непрозрачный объект, который является Подписанным JWT для некоторых реализаций поставщика, но не для всех (Google непрозрачен).

После авторизации вы получаете один или два токена (доступ и ID).Вы можете обернуть их в свой собственный JWT, подписать его, а затем использовать комбинированный JWT любым удобным для вас способом.

...