我一直在尝试使用 jwt 令牌的内容填充 httpcontext,但用户身份验证仍然错误,并且声明中使用的任何数据都没有出现。我注意到 Identities 属性出现以下错误 CS1503 问题:参数 1:无法从“System.Collections.Generic.IEnumerable
这里是配置设置
public static IServiceCollection AddAuth(this IServiceCollection services,
ConfigurationManager configuration)
{
var jwtSettings = new JwtSettings();
configuration.Bind(JwtSettings.SectionName, jwtSettings);
services.AddSingleton(Options.Create(jwtSettings));
services.AddSingleton<IJwtTokenGenerator, JwtTokenGenerator>();
services.AddAuthentication(defaultScheme: JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings.Issuer,
ValidAudience = jwtSettings.Audience,
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(jwtSettings.Secret))
};
});
这是我生成令牌的地方
public string GenerateToken(Guid userId, string firstName, string lastName)
{
var signingCredentials = new SigningCredentials(
new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(_jwtSettings.Secret)),
SecurityAlgorithms.HmacSha256
);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userId.ToString()),
new Claim(JwtRegisteredClaimNames.GivenName, firstName),
new Claim(JwtRegisteredClaimNames.FamilyName, lastName),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
};
var securityToken = new JwtSecurityToken(
issuer: _jwtSettings.Issuer,
audience: _jwtSettings.Audience,
expires: _dateTimeProvider.UtcNow.AddMinutes(_jwtSettings.ExpirationTimeInMinutes),
claims: claims,
signingCredentials: signingCredentials
);
return new JwtSecurityTokenHandler().WriteToken(securityToken);
}
您似乎正在尝试将 Enumerable 隐式转换为 Collection。你尝试过铸造它吗?
这也可能有帮助:How do I conversion IEnumerable to Collection with linq