ASP.NET Core 2.0身份验证中间件

pbz:

遵循Core 1.1的@blowdart的建议,并实现了自定义中间件:

https://stackoverflow.com/a/31465227/29821

它像这样工作:

  1. 中间件运行了。从请求标头中提取一个令牌。
  2. 验证令牌,如果有效,则建立一个包含多个声明的身份(ClaimsIdentity),然后通过HttpContext.User.AddIdentity()添加它;
  3. 在使用services.AddAuthorization的ConfigureServices中,我添加了一个策略来要求由中间件提供的声明。
  4. 然后,在控制器/操作中,我将使用[Authorize(Roles =“中间件添加的某个角色”)]

这在2.0上可以正常工作,除了如果令牌无效(上面的步骤2)并且从未添加声明,我将得到“未指定authenticationScheme,并且未找到DefaultChallengeScheme”。

所以现在我正在阅读auth在2.0中更改了:

https://docs.microsoft.com/zh-cn/aspnet/core/migration/1x-to-2x/identity-2x

在ASP.NET Core 2.0中执行相同操作的正确方法是什么?我没有看到进行真正的自定义身份验证的示例。

扎克:

因此,经过一整天的尝试来解决此问题,我终于弄清楚了微软希望我们如何为核心2.0中的新单一中间件设置创建自定义身份验证处理程序。

浏览了MSDN上的一些文档后,我发现了一个名为的类AuthenticationHandler<TOption>,它实现了IAuthenticationHandler接口。

从那里,我找到了一个完整的代码库,其中包含位于https://github.com/aspnet/Security的现有身份验证方案。

在其中之一的内部,它显示了Microsoft如何实现JwtBearer身份验证方案。https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer

我将大部分代码复制到了一个新文件夹中,并清除了所有与之有关的内容JwtBearer

JwtBearerHandler该类(扩展为AuthenticationHandler<>)中,有一个替代Task<AuthenticateResult> HandleAuthenticateAsync()

我在旧的中间件中添加了通过自定义令牌服务器设置声明的权限,但是仍然遇到一些权限问题,只是在令牌无效且未设置声明时吐出a 200 OK而不是a 401 Unauthorized

我意识到我已经重写了Task HandleChallengeAsync(AuthenticationProperties properties),无论出于何种原因,它都用于[Authorize(Roles="")]在控制器中设置权限

删除此替代之后,代码可以正常工作,并且401在权限不匹配时成功抛出了a

这样做的主要好处是,现在您不能使用自定义中间件,必须通过实现它,AuthenticationHandler<>并且必须在使用时设置DefaultAuthenticateSchemeDefaultChallengeSchemeservices.AddAuthentication(...)

这是所有示例的示例:

在Startup.cs / ConfigureServices()中添加:

services.AddAuthentication(options =>
{
    // the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
    options.DefaultAuthenticateScheme = "Custom Scheme";
    options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });

在Startup.cs / Configure()中添加:

app.UseAuthentication();

创建一个新文件CustomAuthExtensions.cs

public static class CustomAuthExtensions
{
    public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
    }
}

创建一个新文件CustomAuthOptions.cs

public class CustomAuthOptions: AuthenticationSchemeOptions
{
    public CustomAuthOptions()
    {

    }
}

创建一个新文件CustomAuthHandler.cs

internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
        // store custom services here...
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
        return AuthenticateResult.NoResult();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ASP.NET Core Facebook身份验证中间件用户图片

ASP.NET Core 中间件在身份验证之前执行

多种身份验证中间件ASP.NET Core

ASP.NET Core的身份验证中间件是否始终对OpenID Connect使用隐式流?

如何在ASP.NET Core中不需要时绕过身份验证中间件

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

身份验证后,如何在ASP.Net Core中由OpenIdConnect中间件生成的身份验证cookie中添加自定义声明?

无身份ASP.NET Core v2的Cookie中间件

.NET Core允许身份验证中间件中的CORS

在.NET Core 2.0中扩展身份验证中间件的正确方法

带有自定义API密钥中间件的.Net Core JWT身份验证

.net core-Jwt中间件身份验证签名密钥被忽略

ASP.NET Core 2身份验证方案

ASP.NET Core 2充当反向代理用户重写中间件

ASP.NET Core 6 异常中间件和验证

asp.net core mvc中间件简单案例

ASP.NET Core压缩中间件-空响应

无法在ASP.NET Core中使用中间件

ASP .NET Core 中间件中的异步进度?

URL重写中间件ASP.Net Core 2.0

ASP.NET Core Api-Gateway中间件

ASP.NET Core中间件还是OWIN中间件?

使用承载令牌身份验证时设置asp.net CORE 2身份验证Cookie

用于ASP.NET Core 2.x中间件的自定义依赖项注入解析器?

ASP.NET Core 2 Url重写中间件,以从.xxx重定向到.yyy扩展名

代理请求返回401后,Asp.Net Core 2 oidc中间件不会挑战

在 ASP.NET Core 2 中使用令牌或 Open ID Connect 进行身份验证

ASP.NET Core 2中不同区域的身份验证和LoginPath

如何在ASP.NET Core 2中对Facebook Web API进行身份验证