繁体   English   中英

如何在令牌生成时强制执行用户名和密码,或者这是不好的做法

[英]How do I enforce username and password on token generation or is it bad practice

我已经开始了一个简单的 web api 并使用 jwt 为其添加了令牌生成。 但是我在应用程序帐户中使用了用户商店,这是我的 function 用于设置令牌。 它出现在 swagger 中很好,但我不明白如何在请求令牌时强制输入用户名和密码。 或者这是不好的做法。

这是我生成安全令牌时的 class。

public JwtService(IConfiguration config)
{
        var test = config;
          _secret = config.GetSection("JwtToken").GetSection("SecretKey").Value;

        _expDate = config.GetSection("JwtToken").GetSection("expirationInMinutes").Value;
}

    public string GenerateSecurityToken(string email)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_secret);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[]
            {
            new Claim(ClaimTypes.Email, email)
        })
        ,
            Expires = DateTime.UtcNow.AddMinutes(double.Parse(_expDate)),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };

        var token = tokenHandler.CreateToken(tokenDescriptor);

        return tokenHandler.WriteToken(token);

    }
}

 public static IServiceCollection AddTokenAuthentication(this IServiceCollection services, IConfiguration config)
    {
         var secret = config.GetSection("JwtToken").GetSection("SecretKey").Value;
        var keySecret = Base64UrlEncoder.DecodeBytes(secret);

        var key = Encoding.ASCII.GetBytes(keySecret.ToString());
        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x =>
        {
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience = false,
                // ValidIssuer = "localhost",
                //ValidAudience = "localhost"
            };
        });

        return services;
     }

Swagger 代号

  services.AddSwaggerGen(c =>
  {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "App Manager - Running Buddies", Version = "v1" });

            c.AddSecurityDefinition("bearer", new OpenApiSecurityScheme
            {
                Name = "Authorization",
                Type = SecuritySchemeType.ApiKey,
                Scheme = "bearer",
                BearerFormat = "JWT",
                In = ParameterLocation.Header,
                Description = "JWT Authorization header using the Bearer scheme.",
            });
    });

Swagger Ui测试

在此处输入图像描述

您可能希望使用HTTP POST在 model 中传递用户名/密码。 确保仅在登录请求有效时发出令牌,即在您成功验证用户身份之后。 有关详细信息,请参阅使用 JWT 保护 ASP.NET 核心 2.0 应用程序

编辑:要使用身份执行登录,您可以使用SignInManager.PasswordSignInAsync或仅检查凭据SignInManager.CheckPasswordSignInAsync 有关示例,请参见示例:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
    // generate the token
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM