我已经实现了自己的自定义身份验证中间件和处理程序,并在应用启动时对其进行了配置。这一切都很好。
在我已经覆盖 HandleAuthenticateAsync() 以执行我自己的自定义身份验证的自定义身份验证处理程序中,我还覆盖了 HandleUnauthorizedAsync() 以将用户重定向到登录页面,但这没有被调用。
浏览器在响应中收到 401(未授权)。我期待我的 HandleUnauthorizedAsync() 被调用。
我在这里没有正确理解管道吗?
谢谢
我已经实现了自己的自定义身份验证中间件和处理程序,并在应用启动时对其进行了配置。这一切都很好。
在我已经覆盖 HandleAuthenticateAsync() 以执行我自己的自定义身份验证的自定义身份验证处理程序中,我还覆盖了 HandleUnauthorizedAsync() 以将用户重定向到登录页面,但这没有被调用。
浏览器在响应中收到 401(未授权)。我期待我的 HandleUnauthorizedAsync() 被调用。
我在这里没有正确理解管道吗?
谢谢
user1859022 对我的情况有所帮助,但我不想为每个[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());
}
所以请确保在之前UseAuthentication
调用过 UseAuthorization
。
在我的情况下,我的处理程序没有被调用的原因是我没有被AuthenticationScheme
选为默认值。我必须将它包含在我的Authorize
属性中,如下所示:
[HttpGet]
[Authorize(AuthenticationSchemes= "MyAuth")]
public IEnumerable<string> Get()
{
...
}
顺便说一句:该AutomaticChallenge
选项似乎已被删除.net core 2.0
上述解决方案对我也有效,我可以通过以下代码段对其进行改进,因此无需在[Authorize]
属性中指定身份验证方案名称。之前调用该AddAuthentication
方法很重要AddMvc
。
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();
}
米哈伊尔的回答为我解决了这个问题,但只是为了清楚:
如果你的请求是命中ChallengeAsync
但HandleAuthenticateAsync
不是AuthenticateAsync
然后检查您的订购:
app.UseAuthentication();
app.UseAuthorization();