2017-08-21 61 views
32

采用Core 1.1,随后@ blowdart的意见,并实现了自定义的中间件:ASP.NET 2.0的核心中间件认证

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

它的工作是这样的:

  1. 中间件跑。从请求标头中提取一个令牌。
  2. 恪令牌,并且如果有效建立身份(ClaimsIdentity)含有其然后其经由HttpContext.User.AddIdentity添加了多个权利要求();
  3. 在使用services.AddAuthorization ConfigureServices我添加了一个政策,需要由中间件提供的要求。
  4. 在控制器/动作然后我会使用[授权(角色=“一些角色所添加的中间件”)]

这个有点与2.0工作,不同之处在于如果令牌是无效的(步骤2上面)并且声明永远不会被添加我得到“没有指定authenticationScheme,并且没有找到DefaultChallengeScheme。”

所以我现在要读取,权威性在2.0改为:

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

什么,我做同样的事情在ASP.NET 2.0的核心在正确的道路?我没有看到一个例子,做真正的自定义验证...

感谢

+0

试试这个链接,即使它说,2种方案,但它将给ü上的身份验证HTTPS对决://wildermuth.com/2017/08/19/Two-AuthorizationSchemes-in-ASP-NET-Core-2 –

+0

您可以添加您的代码,以便我们可以看看吗?我知道我在core2.0的智威汤逊有问题 - 是在启动时移动它的一个案例 – Webezine

回答

64

因此,试图解决这个问题,经过漫长的一天,我终于想通了,微软希望我们如何让自定义验证处理程序在核心2.0新单曲的中间件的设置。

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

从那里,我发现了位于https://github.com/aspnet/Security

里面的其中之一的现有认证方案的整个代码库,它显示了微软是如何实现JwtBearer认证方案。 (https://github.com/aspnet/Security/tree/dev/src/Microsoft.AspNetCore.Authentication.JwtBearer

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

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

我在我们的旧中间件添加了对通过自定义令牌服务器设置要求的覆盖,并且仍然遇到一些问题的权限,只是随地吐痰如果令牌无效并且没有设置索赔,则输出200 OK而不是401 Unauthorized

我意识到我已经重写了Task HandleChallengeAsync(AuthenticationProperties properties),无论什么原因,它都是通过控制器中的[Authorize(Roles="")]来设置权限。

删除此重写后,代码已经工作,并且在权限不匹配时已成功抛出401

从这个主要的外卖是,现在你不能使用自定义的中间件,你必须通过AuthenticationHandler<>实现它,你有DefaultAuthenticateSchemeDefaultChallengeScheme使用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 /配置()地址:

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(); 
    } 
} 
+1

伟大的文章,但我有一些问题编译你的代码。 CustomAuthOptions和AuthenticateResult类型缺失。你可以发布这些? – alexb

+0

CustomAuthOptions是一个继承自AuthenticationSchemeOptions的简单空类。 AuthenticateResult在Microsoft.AspNetCore.Authentication中定义(您需要导入该包)。 – pbz

+0

@alexb我编辑了原始答案以解决您的观点。 – pbz

0

个人信息中有以核2.0相当大的变化,从核心的1.x为您引用的文章指出。主要变化是摆脱中间件方法,并使用依赖注入来配置定制服务。这为定制更复杂实现的Identity提供了更多的灵活性。所以你想摆脱上面提到的中间件方法并转向服务。按照参考文章中的迁移步骤实现此目标。通过app.UseAuthentication更换app.UseIdentity启动。 UseIdentity折旧并不会在将来的版本中得到支持。有关如何插入一个自定义声明变换和在权利要求view this blog post执行授权一个完整的示例。

+4

有没有关于如何在WebAPI应用中使用它的例子? – alexb