使用身份验证构建器加载 jwt 令牌内容时出现问题

问题描述 投票:0回答:1

我一直在尝试使用 jwt 令牌的内容填充 httpcontext,但用户身份验证仍然错误,并且声明中使用的任何数据都没有出现。我注意到 Identities 属性出现以下错误 CS1503 问题:参数 1:无法从“System.Collections.Generic.IEnumerable”转换为“System.Collections.Generic.ICollection

这里是配置设置

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);
    }

当我解密创建的令牌时,信息就在那里,我相信这是身份验证服务中的问题。Here is a print of httpcontext with token

c# authentication jwt
1个回答
0
投票

您似乎正在尝试将 Enumerable 隐式转换为 Collection。你尝试过铸造它吗?

这也可能有帮助:How do I conversion IEnumerable to Collection with linq

© www.soinside.com 2019 - 2024. All rights reserved.