[ASP.NET Core] ASP.NET Core 1.1 升级至 ASP.NET Core 2.0 自订验证的问题

心血来潮,将某个小项目的 ASP.NET Core 相关套件从 1.1 更新至 2.0,

更新套件看起来没什么问题,执行起来到有 [Authorize] 的 Action 前,立马挂在 middleware next()...


出现的例外状况的消息

No authenticationScheme was specified, and there was no DefaultChallengeScheme found

在1.1的时候,并不用设定 authenticationScheme 与 DefaultChallengeScheme 也能正常运行,

经过好几次的 keyword 搜寻后,看到官方有提到 Migrating Authentication and Identity to ASP.NET Core 2.0,

但我并不是用 Cookie-based、JWT Bearer、OpenID Connect (OIDC)、Facebook、Google、Microsoft Account、Twitter 等已经写好的认证,

为了了解认证是怎么实践的,我自己写自订验证的,所以关键在于自订验证需要做什么调整,

所以很快找到 ASP.NET Core 2.0 authentication middleware 相关的提问,

再回头看 Migrating Authentication and Identity to ASP.NET Core 2.0,

才发现 ASP.NET Core 2.0 的认证改定义在实践 AuthenticationHandler<> 的 HandleAuthenticateAsync 方法,

然后在 Startup/ConfigureServices 增加认证服务 AddAuthentication(),

同时 AddAuthentication() 回传 AuthenticationBuilder 用来 AddScheme,注册你实践好的 AuthenticationHandler<>,

最后在 Startup/Configure 使用认证 UseAuthentication() 就能完成新的 ASP.NET Core 2.0 认证方式,

其中要实践的类,可以详细看这篇 ASP.NET Core 2.0 authentication middleware,有最低需求的建置要点。

注意的是实践 AuthenticationHandler<> 时,如果是用 VS 快速动作与重构产生的建构子,

构造函数默认会是 protected 修饰词,在执行时 DI 会无法 Injection,就会出现类似例外错误消息:

A suitable constructor for type 'xxx Type' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.

改成 public 修饰词才能正常透过建构子注入,我以为是构造函数参数的问题,浪费我不少时间找错误...