我正在试图找出在.NET Core 2.0 WebAPI项目中扩展身份验证的正确方法。
我正在使用Identity with Entity Framework存储。我已经使用AddAuthentication()
和UseAuthentication()
配置了支持身份验证的服务。
我正在使用JWT令牌通过AddJwtBearer()
进行身份验证。现在我想添加API来为我处理两件事:
SignInManager
注入我的Account
控制器即可实现。我唯一想到的是将此登录流程构建到我的Account
控制器中,通过EF Identity Store验证用户名/密码,然后使用我的自定义商店进行验证,如果找到匹配项,则手动调用“新用户”方法Account
控制器。但是,这种方法对我来说并不合适,因为在.NET 1.1中,这是通过构建自己的身份验证中间件来解决的。但是,我找不到任何.NET 2.0方法的文档。
解决问题的最佳方法是什么?
这似乎更像是一种风格/设计问题。
A)您确实可以将所有内容放入AccountController
,在“登录”期间,您可以添加“注册”作为其中的一部分(如果您发现用户凭据的“外部”匹配),就像您建议的那样。
我没有看到这样做的巨大缺点(虽然我自己更喜欢中间件,因为你可以在启动时更多'配置'东西)。
设计方面,可能存在将外部提供程序与内部标识存储库同步的问题(如果情况通常如此),但这适用于这些选项中的任何一个。经常引入一个专门的授权服务器可以解决这个问题,但我不知道足够的细节,所以只是猜测。
B)如果我正在读你写你想要的东西, 添加身份验证。中间件我用过这样的东西(基于它): TokenProviderMiddleware (那个GitHub solution就是一个很好的例子)
基本上(总结一些代码):
你可以从Configure(启动)中调用类似app.UseTokenProvider();
的东西。
app.UseTokenProvider(_tokenProviderOptions);
// or directly (w/o the extension method)
app.UseMiddleware<TokenProviderMiddleware>();
...
...并且TokenProviderMiddleware
有一定的特征要满足(将链中的下一个注入到.ctor和public Task Invoke(HttpContext context)
中
这允许您跳过控制器,或者您希望跳过控制器。
不确定这是否能解决你的麻烦,但它帮助我做了类似的事情。