我正在尝试找出正确的方法在.NET Core 2.0 WebAPI项目中扩展身份验证。
我正在使用实体框架商店的身份。我已经配置了使用AddAuthentication()
和UseAuthentication()
的身份验证的服务。
我正在使用JWT令牌通过AddJwtBearer()
进行身份验证。现在我想添加API为我处理两件事:
-
验证用户名和密码,并在"实体框架身份识别商店中有匹配"(如果有匹配项中)发出JWT令牌。这部分非常容易,我只需将
SignInManager
注入我的Account
控制器即可实现。 -
如果找不到用户,我想使用自定义身份验证流,并验证用户是否存在在其他"位置"中,如果有匹配项 - 在身份店中创建用户。现在,这就是我试图找出最佳方法。
唯一想到的是将此登录流程构建到我的Account
控制器中,通过EF Identity Store验证用户名/密码,然后使用我的自定义商店进行验证,如果找到匹配匹配,请致电"新用户"方法从Account
控制器手动。但是,这种方法对我来说并不适合我,因为在.NET 1.1中,这是通过建立自己的身份验证中间的解决方案来解决的。但是,我找不到.NET 2.0方法的任何文档。
解决问题的最佳方法是什么?
这似乎更像是样式/设计问题。
a)您确实可以将所有内容都放入AccountController
,在"登录"期间,您可以将"注册"添加到其中(如果您找到"外部"匹配的'用户凭证),几乎是您建议的。
我看不到这样做的巨大缺点(尽管我通常更喜欢中间件,因为您可以在启动中"配置"事物)。
设计明智的是,可能存在一个问题,将您的外部提供商与内部身份商店同步(如果是这种情况,通常就是这样),但这适用于这些选项中的任何一个。通常,引入专门的授权服务器可以解决这一点,但我不知道足够的细节,所以只是猜测。
b)如果我读了你写你想要的东西,
添加auth。中间件我使用了这样的东西(基于它):
TokenProviderMiddleware
(该GitHub解决方案是一个很好的例子)
基本上(总结一些代码):
您可以从配置(启动)中调用类似app.UseTokenProvider();
的内容。
app.UseTokenProvider(_tokenProviderOptions);
// or directly (w/o the extension method)
app.UseMiddleware<TokenProviderMiddleware>();
...
...且TokenProviderMiddleware
具有一定的签名以满足(将链中的下一个注入.ctor和 public Task Invoke(HttpContext context)
这使您可以跳过控制器,或者尽可能多地这样做。
不确定这是否解决了您的麻烦,但它帮助我做了类似的事情。