ASP.NET 核心中的授权。 [Authorize] 属性总是 401 Unauthorized
Authorization in ASP.NET Core. Always 401 Unauthorized for [Authorize] attribute
我第一次在 ASP.NET Core 中创建授权。
我使用了这里的教程 TUTORIAL
问题是当我从邮递员发送请求时:
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 未授权错误的原因。
希望对大家有所帮助 ;)
我的解决方案是在 Startup 的 Configure 方法中检查中间件和其他内容的正确顺序。一般app.UseMvc();
在我的例子中,我遵循了 coreApi,angularClient 教程,但每次都会出现未经授权的错误在我的例子中,angular 应用程序 运行 在核心 Api 项目下。
然后我像这样更改了顺序,现在可以使用了
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());
}
如果您使用的是 ASP.NET Core 3.0
查看此订单
app.UseAuthentication();
app.UseRouting();
//必须低于app.UseAuthentication();
如果您使用的是 ASP.NET Core < 3.0
只需将 app.UseRouting();
替换为 app.UseMvc();
即:
app.UseAuthentication();
app.UseMvc();
//必须低于app.UseAuthentication();
在 ASP.NET Core 3.0 中,我遇到了同样的问题,对我有用的是:
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
在 StartUp.Configure 方法中。
此文档显示了中间件组件的典型顺序:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0
我的 ConfigureServices 和 Configure 方法(Asp.Net Core 3.1.0)在 Startup class:
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 或更高版本的用户,此订单在 "configure" 位于 StartUp.cs
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
在我的例子中,我还使用了 app.MapWhen(代码)和 app.UseAuthentication();应该在map之前,像这样
app.UseAuthentication();
app.MapWhen();
app.UseMvc();
希望这会有所帮助。
我第一次在 ASP.NET Core 中创建授权。 我使用了这里的教程 TUTORIAL
问题是当我从邮递员发送请求时:
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 未授权错误的原因。
希望对大家有所帮助 ;)
我的解决方案是在 Startup 的 Configure 方法中检查中间件和其他内容的正确顺序。一般app.UseMvc();
在我的例子中,我遵循了 coreApi,angularClient 教程,但每次都会出现未经授权的错误在我的例子中,angular 应用程序 运行 在核心 Api 项目下。
然后我像这样更改了顺序,现在可以使用了
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());
}
如果您使用的是 ASP.NET Core 3.0
查看此订单
app.UseAuthentication();
app.UseRouting();
//必须低于app.UseAuthentication();
如果您使用的是 ASP.NET Core < 3.0
只需将 app.UseRouting();
替换为 app.UseMvc();
即:
app.UseAuthentication();
app.UseMvc();
//必须低于app.UseAuthentication();
在 ASP.NET Core 3.0 中,我遇到了同样的问题,对我有用的是:
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
在 StartUp.Configure 方法中。
此文档显示了中间件组件的典型顺序: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0
我的 ConfigureServices 和 Configure 方法(Asp.Net Core 3.1.0)在 Startup class:
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 或更高版本的用户,此订单在 "configure" 位于 StartUp.cs
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
在我的例子中,我还使用了 app.MapWhen(代码)和 app.UseAuthentication();应该在map之前,像这样
app.UseAuthentication();
app.MapWhen();
app.UseMvc();
希望这会有所帮助。