ASP.NET Core 2.0身份验证中间件
使用Core 1.1遵循@blowdart的建议,并实现了自定义中间件:
https://stackoverflow.com/a/31465227/29821
它像这样工作:
- 中间件运行了。从请求标头中提取一个令牌。
- 验证令牌,如果有效,则建立一个包含多个声明的身份(ClaimsIdentity),然后通过HttpContext.User.AddIdentity()添加它;
- 在使用services.AddAuthorization的ConfigureServices中,我添加了一个策略来要求由中间件提供的声明。
- 然后,在控制器/操作中,我将使用[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<>
并且必须在使用时设置DefaultAuthenticateScheme
和。DefaultChallengeScheme``services.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();
}
}
以上是 ASP.NET Core 2.0身份验证中间件 的全部内容, 来源链接: utcz.com/qa/420049.html