我已经实现了我自己的自定义认证中间件和处理程序,并在应用程序启动时配置了它们。这一切都工作得很好。在我的自定义身份验证处理程序中,我重写了HandleAuthenticateAsync()来执行我自己的自定义身份验证,我还重写了HandleUnauthorizedAsync(),以便将用户重定向到登录页面,但没有调用它。浏览器在响应中收到401(未授权)。我希望调用我的HandleUnauthorizedAsync()。我对管道的理解不正确吗?谢谢
8qgya5xd1#
user1859022对我的例子有帮助,但是我不想为每个[Authorize]输入我的方案的名称,而且指定DefaultAuthenticateScheme最初也不起作用。我的错误有点愚蠢。我有app.UseAuthorization()和app.UseAuthentication(),当然顺序是错误的。正确的版本是
[Authorize]
DefaultAuthenticateScheme
app.UseAuthorization()
app.UseAuthentication()
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => endpoints.MapControllers()); }
因此,请确保在调用**UseAuthorization之前调用**UseAuthentication。在.NET7中,他们简化了它,因此可以使用以下几行代码:
UseAuthorization
UseAuthentication
builder.Services.AddAuthentication().AddJwtBearer(); builder.Services.AddAuthorization();
tkclm6bt2#
在我的例子中,我的处理程序没有被调用的原因是我的AuthenticationScheme没有被选为默认值。我必须将它包含在我的Authorize属性中,如下所示:
AuthenticationScheme
Authorize
[HttpGet] [Authorize(AuthenticationSchemes= "MyAuth")] public IEnumerable<string> Get() { ... }
顺便说一句:AutomaticChallenge选项似乎已在.net core 2.0中删除
AutomaticChallenge
.net core 2.0
lzfw57am3#
上面的解决方案对我来说也是有效的,我可以通过下面的代码段对其进行改进,这样就不需要在[Authorize]属性中指定身份验证方案名称。在AddMvc之前调用AddAuthentication方法是很重要的。
AddMvc
AddAuthentication
public void ConfigureServices(IServiceCollection services) { //must be placed before the AddMvc call services.AddAuthentication(options => { options.DefaultAuthenticateScheme = "MyAuth"; options.DefaultChallengeScheme = "MyAuth"; }) .AddCustomAuth(o => { }); services.AddMvc(); }
p5fdfcr14#
米哈伊尔的回答为我解决了这个问题,但只是为了让它清楚:如果您的请求命中ChallengeAsync,但未命中HandleAuthenticateAsync或AuthenticateAsync然后检查您的订单:
ChallengeAsync
HandleAuthenticateAsync
AuthenticateAsync
app.UseAuthentication();
app.UseAuthorization();
4条答案
按热度按时间8qgya5xd1#
user1859022对我的例子有帮助,但是我不想为每个
[Authorize]
输入我的方案的名称,而且指定DefaultAuthenticateScheme
最初也不起作用。我的错误有点愚蠢。我有
app.UseAuthorization()
和app.UseAuthentication()
,当然顺序是错误的。正确的版本是因此,请确保在调用**
UseAuthorization
之前调用**UseAuthentication
。在.NET7中,他们简化了它,因此可以使用以下几行代码:
tkclm6bt2#
在我的例子中,我的处理程序没有被调用的原因是我的
AuthenticationScheme
没有被选为默认值。我必须将它包含在我的Authorize
属性中,如下所示:顺便说一句:
AutomaticChallenge
选项似乎已在.net core 2.0
中删除lzfw57am3#
上面的解决方案对我来说也是有效的,我可以通过下面的代码段对其进行改进,这样就不需要在
[Authorize]
属性中指定身份验证方案名称。在AddMvc
之前调用AddAuthentication
方法是很重要的。p5fdfcr14#
米哈伊尔的回答为我解决了这个问题,但只是为了让它清楚:
如果您的请求命中
ChallengeAsync
,但未命中HandleAuthenticateAsync
或AuthenticateAsync
然后检查您的订单:
app.UseAuthentication();
app.UseAuthorization();