首页 > 解决方案 > 身份验证令牌总是返回未经授权的

问题描述

我目前正在尝试使用不记名令牌,无论我做什么,我都会收到 HTTP 401 未经授权的错误。

我正在关注JWT 实施指南,我有一个处理 JWT 的扩展方法。

public static class AuthenticationExtension 
{
    public static IServiceCollection AddTokenAuthentication(this IServiceCollection services, IConfiguration config) 
    {
        var secret = config.GetSection("JwtConfig").GetSection("secret").Value;

        var key = Encoding.ASCII.GetBytes(secret);

        services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false, 
                    ValidateAudience = false,
                    // ValidIssuer = "localhost",
                    //ValidAudience = "localhost"
                };
        });

        return services;
    }
}

以下是令牌控制器生成令牌 obv 的方式,例如,我应该从标头而不是电子邮件和密码中获取值。

如果在代码中找到该代码,则不能替换该代码。

var  token = jwt.GenerateSecurityToken("fake@email.com"); 

在我StartUp.cs的配置中,我只需将中间件添加到我的配置中。在服务部分,我进行了测试

  services.AddTokenAuthentication(Configuration);

但正如您所见,我收到未经授权的 HTTP 401 返回。

在此处输入图像描述

这是来自 api/token 控制器的代码。

[Route("api/[controller]")]
[ApiController]
public class TokenController : ControllerBase
{
    private IConfiguration _config;

    public TokenController(IConfiguration config)
    {
        _config = config;
    }

    [HttpGet]
    public string GetRandomToken()
    {
        var jwt = new JwtService(_config);
        var token = jwt.GenerateSecurityToken("fake@email.com");
        return token;
    }
}

来自 api/token 的令牌

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImZha2VAZW1haWwuY29tIiwibmJmIjoxNTg2NjMzMTkwLCJleHAiOjE1ODY3MTk1OTAsImlhdCI6MTU4NjYzMzE5MH0.SPSERcPpD4f48sWYQwTWpD4f48sWYQwpTUB

这是我的appSettings.json配置,一旦我有了这个设置,我当然会改变我的秘密。

这是否足以保护 api 或者您是否还应该在 api 层中使用客户端 ID 和机密。HMAC 风格。

"JwtConfig": {
    "secret": "PDv7DrqznYL6nv7DrqzjnQYO9JxIsWdcjnQYL6nu0f",
    "expirationInMinutes": 1440   
},

标签: c#asp.net-mvcrest

解决方案


推荐阅读