почему мы должны предоставлять издателя, аудиторию и ключ как AddJwtBearer в ConfigureServices, так и при создании нового JwtSecurityToken в asp. net ядре - PullRequest
1 голос
/ 11 февраля 2020

Я новичок в Аутентификация JWT . Я практикую это, используя это демонстрационное решение в моем репо . Я понял, как работает код, и смог заставить его работать. Но у меня есть вопрос, который продолжает беспокоить меня. Почему мы должны предоставлять ключ, издателя и аудиторию в обоих местах?

ConfigureServices - Startup:

services
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,

                ValidIssuer = "http://localhost:44348",
                ValidAudience = "http://localhost:44348",
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("superSecretKey@345"))
            };
        });

Код создания токена в AuthController:

private JwtSecurityToken GenerateToken(IEnumerable<Claim> claims)
{
    var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("superSecretKey@345"));
    var signinCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);

    var tokeOptions = new JwtSecurityToken(
        issuer: "http://localhost:44348",
        audience: "http://localhost:44348",
        claims: claims,
        expires: DateTime.Now.AddMinutes(1),
        signingCredentials: signinCredentials
    );
    return tokeOptions;
}

Если мы заметим, мы можем видеть ключ, эмитента и аудиторию в обоих местах. Насколько я вижу, мы делаем из-за конфигурации или настройки? Я думаю, что мы должны предоставить эти конфигурации только на ConfigureServices. Пожалуйста, исправьте меня, если я ошибаюсь, и помогите объяснить причины, по которым мы делаем это в двух местах.

1 Ответ

1 голос
/ 11 февраля 2020

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

Вам не нужно. Просто введите JwtBearerOptions, когда вам нужно. Например, измените AuthController на IOptionsSnapshot<JwtBearerOptions:

public class AuthController : ControllerBase
{
    private static readonly Dictionary<string, string> _userTokens = new Dictionary<string, string> { { "abdul", null } };
    private readonly JwtBearerOptions jwtOpts;

    public AuthController(IOptionsSnapshot<JwtBearerOptions> jwtOpts)
    {
        this.jwtOpts = jwtOpts.Get(JwtBearerDefaults.AuthenticationScheme) ?? throw new Exception("JwtBearerOptions is null!");
    }

    private JwtSecurityToken GenerateToken(IEnumerable<Claim> claims)
    {
        var key = this.jwtOpts.TokenValidationParameters.IssuerSigningKey;
        var signCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var tokeOptions = new JwtSecurityToken(
            issuer: jwtOpts.TokenValidationParameters.ValidIssuer,
            audience: jwtOpts.TokenValidationParameters.ValidAudience,
            claims: claims,
            expires: DateTime.Now.AddMinutes(1),
            signingCredentials: signCredentials
        );
        return tokeOptions;
    }

   ...
...