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