如何从ASP.NET Core 2.0中的自定义中间件请求身份验证

Ryt*_*hon 5 c# asp.net-core asp.net-core-middleware

我有两种自定义的ASP.NET Core中间件:一种用于身份验证(注册自己的身份验证方案),另一种用于某些业务工作。

如何在另一个中间件中使用身份验证中间件?我可以像这样在MVC中轻松使用身份验证:

 services.AddMvc(config =>
 {
     var policy = new AuthorizationPolicyBuilder()
                      .RequireAuthenticatedUser()
                      .Build();
     config.Filters.Add(new AuthorizeFilter(policy));
 });
Run Code Online (Sandbox Code Playgroud)

我还可以AuthenticationSchemeProvider根据请求的URL 提供自己的身份以使用不同的身份验证方案。但是身份验证中间件仅在MVC控制器上运行。我希望它在我的自定义中间件运行之前也能运行。有可能这样做吗?

Ryt*_*hon 6

如果用户未通过身份验证,则在自定义中间件方法Invoke()调用中ChallengeAsync()

public async Task Invoke(HttpContext httpContext, IServiceProvider serviceProvider)
{
    if (!httpContext.User.Identity.IsAuthenticated)
    {
        await httpContext.ChallengeAsync();
    }
    else { /* logic here */ }
}
Run Code Online (Sandbox Code Playgroud)

Microsoft.AspNetCore.Authentication.Abstractions必须添加NuGet软件包。

上面的代码将运行默认的身份验证服务以对用户进行身份验证。如果默认的是您的自定义身份验证中间件,则它将被调用。

  • 等待httpContext.ChallengeAsync(); 是有帮助的。但是httpContext.User.Identity.IsAuthenticated始终为false (2认同)