我正在try 使用Program.cs文件中的以下代码在ASP.NET API中生成JWT令牌:

var key = Encoding.ASCII.GetBytes(Settings.Secret);
builder.Services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(key),
        ValidateIssuer = false,
        ValidateAudience = false
    };
});
app.UseAuthorization();
app.UseAuthentication();

然后,我使用以下代码来生成令牌:

namespace DeliveryAPI.Services
{
    public class TokenService
    {
        public static string GenerateToken(EstablishmentLoginDTO request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            var key = Encoding.ASCII.GetBytes(Settings.Secret);
            var tokenConfig = new SecurityTokenDescriptor
            {
                Subject = new System.Security.Claims.ClaimsIdentity(new Claim[]
                {
                    new Claim("email", request.Email.ToString())
                }),
                Expires = DateTime.UtcNow.AddHours(2),
                SigningCredentials = new SigningCredentials(
                    new SymmetricSecurityKey(key), Security算法rithms.HmacSha256)
            };

            var tokenHandler = new JwtSecurityTokenHandler();
            var token = tokenHandler.CreateToken(tokenConfig);
            var tokenString = tokenHandler.WriteToken(token);

            return tokenString;
        }
    }
}

然后,我在我的请求的"Authorization"头中使用生成的令牌,但我总是得到一个"401 Underated"错误.我使用的是ASP.NET7.

在前端,我在请求头中使用令牌,如下所示:

"Authorization": `Bearer ${token}`

使用我的JWT令牌的postman 也有同样的问题.

导致此错误的原因可能是什么,以及如何排除它的故障?

推荐答案

您需要确定身份验证中间件的顺序.

重要的是首先进行身份验证,如果通过身份验证,则进行授权.

因此,您需要做的就是将auth行更改为:

app.UseAuthentication();
app.UseAuthorization();

Csharp相关问答推荐

使用ElasticsearchClient设置忽略属性.默认MappingFor<>

等待限制选项似乎不适用于频道

更新数据库中的对象失败,原因是:Microsoft. EntityFrame Core. GbUpdateConcurrencyResponse'

当打印一行x个项目时,如何打印最后一行项目?

如何在Reflection. Emit中使用具有运行时定义的类型参数的泛型类型

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

如何将Kafka消息时间戳转换为C#中的日期和时间格式?

选取器与.NET Maui MVVM的绑定属性

Razor视图Razor页面指向同一端点时的优先级

如何在C#中使用Postman中的本地IP向本地主机上运行的本地API发出请求

每个http请求需要60秒,为什么?

从另一个不同 struct 的数组创建Newtonsoft.Json.Linq.J数组

在被Interactive Server切换后,Blazor SSR页面无法正确加载JS

Azure Functions v4中的Serilog控制台主题

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

如何更改Datagridview行标题

实体框架允许您具有筛选的属性吗?

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?

在C#中删除多个不同名称的会话

我如何为我的Blazor应用程序构建一个动态教程标注?