这是我第一次在ASP.NET Core中创建认证。我使用了这里的教程:TUTORIAL
问题是当我从Postman发送请求时:
Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...
针对我的带有 [Authorize] 标记的控制器方法,我总是收到 401 Unauthorized
的错误提示……我看到了下面的评论,似乎也有一些人遇到了类似的问题。我不知道该如何解决这个问题。
这是我第一次在ASP.NET Core中创建认证。我使用了这里的教程:TUTORIAL
问题是当我从Postman发送请求时:
Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...
针对我的带有 [Authorize] 标记的控制器方法,我总是收到 401 Unauthorized
的错误提示……我看到了下面的评论,似乎也有一些人遇到了类似的问题。我不知道该如何解决这个问题。
根据他人的要求,这是答案:
问题出在 Startup.cs 中中间件的顺序。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
ConfigureAuth(app); // your authorisation configuration
app.UseMvc();
}
为什么中间件顺序很重要?如果我们先放置app.UseMvc()
,那么MVC动作将进入路由,如果它们看到Authorize属性,它们将控制其处理,这就是我们收到401未经授权的错误的原因。
我希望能帮助到大家;)
UseMvc
替换为 UseRouting
。 - Scott Pageapp.UseMvc()
之前添加app.UseAuthentication()
,这可能是上面的ConfigureAuth(app)
调用的内容。 - baltzarapp.UseAuthentication()
然后是 app.UseMvc()
。 - baltzar在 ASP.NET Core 3.0 中,我也遇到了同样的问题,对我有用的是:
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
在 Startup.Configure 方法中。
此文档展示了中间件组件的典型排序: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0
app.UseAuthentication();
app.UseRouting();
//必须在app.UseAuthentication();
之后app.UseRouting();
替换为app.UseMvc();
例如:
app.UseAuthentication();
app.UseMvc();
//必须在app.UseAuthentication();
之后在 Startup 类中,我的 ConfigureServices 和 Configure 方法(Asp.Net Core 3.1.0):
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowsAll", builder =>
{
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
});
});
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
...
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseCors(options => options.AllowAnyOrigin());
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
我的控制器:
[Authorize]
[EnableCors("AllowsAll")]
[Route("[controller]")]
public class MyController : MyController
{
...
}
对于 .NET CORE 3.0 或更高版本的用户,在 StartUp.cs 文件的 "configure" 中使用此命令。
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
// global cors policy
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
}
我通过在Startup类的Configure方法中更改UseAuthentication()的顺序和UseRouting()来解决了我的问题。
修改前
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
之后
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
app.MapWhen();
app.UseMvc();
app.UseMvc();
。
JwtBearerMiddleware
应该会产生很多日志事件。在Startup.Configure
方法中添加一个记录器并进行检查。 - Ilya Chumakov