asp.net-core - 扩展 ASP.NET Core 中现有 AuthenticationScheme 的首选解决方案
问题描述
我正在尝试集成一个非常简单的身份验证方案,该方案基本上可以分解为:
- 使用 Windows 身份验证对用户进行身份验证;
- 确保用户的 AD 名称存在于数据库中并获取其内部 ID 以将其添加为声明。
我的第一种方法看起来有点像这样:
- 通过服务构建器添加默认协商认证方案;
UseAuthentication()
配置一个中间件,在和之间调用,UseAuthorization()
寻找需要添加的ID;如果不成功,它会以 401 中断流水线。
虽然这在技术上可行,但我认为更简洁的解决方案是将 ID 解析视为方案本身的一部分,而不需要包含中间件。
有没有一种简单的方法可以做到这一点?也许通过继承 AuthenticationHandler 使用的Negotiate
?结果应如下所示:
services.AddAuthentication(MyCustomNegotiateAuthenticationScheme.Name)
.AddCustomNegotiate();
现在应该不需要额外的中间件,只需调用
UseAuthentication()
(中提供的方案DefaultIdentity
做了类似的事情,它只需要服务配置,并且从 cookie 中包含所需的声明。)
解决方案
我建议您查看身份验证方案的事件。您可以在那里操纵主体以及身份验证流程。(事件通常使用返回 Task 的 Func,因此您可以在那里使用 async-await。)
例如,使用 cookie auth 您可以执行以下操作:
services.AddAuthentication()
.AddCookie(options =>
{
options.Events.OnValidatePrincipal = context => { your logic goes here... }
});
另一种方法可能是为这些类之一创建自定义实现:
在这种方法中,我将从其中一个继承,并尝试覆盖其中一个(受保护的或公共的)方法。你可以在这里找到它的当前实现。
推荐阅读
- forms - 使用 RestSharp 发布表单数据
- javascript - Firestore 实时监听器和成本
- google-analytics - Google Analytics 始终将“平均页面加载时间”显示为零
- android - 在没有 gradle 插件的情况下设置 New Relic
- python - 使用 requirements.txt 在新的 conda 环境中自动安装来自 conda 通道和 pip 的包
- libgit2 - 使用 libgit2sharp 将远程分支拉到本地分支的正确方法是什么?
- python-3.x - 如何指定 VS 代码绑定以将文件从 /tmp 上传到 Azure 函数中的 blob 存储
- javascript - 从数组中获取变量然后传递给nodejs请求模块上的url
- sql - 以另一个表为条件的 SQL
- html - 如何让动画从 div 的当前位置开始?