如何将自定义身份验证提供程序集成到 IdentityServer4 中

2023-11-25

是否可以以某种方式扩展 IdentityServer4 来运行自定义身份验证逻辑?我需要根据几个现有的自定义身份系统验证凭据,并且很难找到扩展点来执行此操作(他们使用自定义协议)。 所有这些现有系统都具有客户端知道的 API 密钥的概念。 IdentityServer 现在的工作应该是验证此 API 密钥,并从系统中提取一些现有的声明。 我想象做这样的事情:

POST /connect/token
    custom_provider_name=my_custom_provider_1&
    custom_provider_api_key=secret_api_key

然后我按照我的逻辑打电话my_custom_provider_1,验证 API 密钥,获取声明并将其传递回 IdentityServer 流程​​以完成其余操作。

这可能吗?


我假设您可以控制客户端及其发出的请求,以便您可以对身份服务器进行适当的调用。

It is可以使用自定义身份验证逻辑,毕竟这就是ResourceOwnerPassword流程的全部内容是:客户端将信息传递到 Connect/token 端点,然后您编写代码来决定该信息的含义,并决定这是否足以验证该客户端。不过,您肯定会走出人迹罕至的地方去做您想做的事情,因为按照惯例,客户端传递的信息是username and a password.

In your Startup.ConfigureServices您将需要添加您自己的实现IResourceOwnerPasswordValidator,有点像这样:

services.AddTransient<IResourceOwnerPasswordValidator, ResourceOwnerPasswordValidator>();

然后在ValidateAsync该类的方法,您可以执行任何您喜欢的逻辑来决定是否设置context.Result到一个成功的GrantValidationResult,或者失败的。用这种方法可以帮助你的一件事是ResourceOwnerPasswordValidationContext可以访问原始请求。因此,您添加到对连接/令牌端点的原始调用中的任何自定义字段都将可供您使用。您可以在此处添加自定义字段(提供商名称、API 密钥等)。

祝你好运!

编辑:上面的方法可以工作,但实际上是滥用标准拨款/流程。 OP找到的使用方法要好得多IExtensionGrantValidator用于滚动您自己的授权类型和身份验证逻辑的接口。例如:

从客户端调用身份服务器:

POST /connect/token
grant_type=my_crap_grant&
scope=my_desired_scope&
rhubarb=true&
custard=true&
music=ska

向 DI 注册您的延期补助金:

services.AddTransient<IExtensionGrantValidator, MyCrapGrantValidator>();

并实现您的赠款验证器:

public class MyCrapGrantValidator : IExtensionGrantValidator
{
    // your custom grant needs a name, used in the Post to /connect/token
    public string GrantType => "my_crap_grant";

    public async Task ValidateAsync(ExtensionGrantValidationContext context)
    {
        // Get the values for the data you expect to be used for your custom grant type
        var rhubarb = context.Request.Raw.Get("rhubarb");
        var custard = context.Request.Raw.Get("custard");
        var music = context.Request.Raw.Get("music");

        if (string.IsNullOrWhiteSpace(rhubarb)||string.IsNullOrWhiteSpace(custard)||string.IsNullOrWhiteSpace(music)
        {
            // this request doesn't have the data we'd expect for our grant type
            context.Result = new     GrantValidationResult(TokenRequestErrors.InvalidGrant);
            return Task.FromResult(false);
        }

        // Do your logic to work out, based on the data provided, whether 
        // this request is valid or not
        if (bool.Parse(rhubarb) && bool.Parse(custard) && music=="ska")
        {
            // This grant gives access to any client that simply makes a 
            // request with rhubarb and custard both true, and has music 
            // equal to ska. You should do better and involve databases and 
            // other technical things
            var sub = "ThisIsNotGoodSub";
            context.Result = new GrantValidationResult(sub,"my_crap_grant");
            Task.FromResult(0);
        }

        // Otherwise they're unauthorised
        context.Result = new GrantValidationResult(TokenRequestErrors.UnauthorizedClient);
        return Task.FromResult(false);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将自定义身份验证提供程序集成到 IdentityServer4 中 的相关文章

随机推荐

  • os.system()在哪个linux shell下执行命令?

    我在用 bin tcsh作为我的默认外壳 然而 tcsh 风格的命令os system setenv VAR val 对我不起作用 但os system export VAR val works 所以我的问题是我怎样才能知道os syste
  • 安全性:如何验证图像文件上传?

    我需要接受用户上传的图像文件 如何检查并 100 确定我没有收到恶意文件或其他内容 检查 mime 类型 重新画图 防病毒 重新绘制图像 读取它GD s imagecreatefromXXX 并将其保存回来imageXXX 通过这种方式 您
  • 使用 JWT 验证套接字 io 连接

    如何验证 socket io 连接 我的应用程序使用来自另一台服务器 python 的登录端点来获取令牌 每当用户在节点端打开套接字连接时 如何才能使用该令牌 io on connection function socket socket
  • 上传json数据时如何按百分比显示进度条状态?

    我正在上传字符串和照片 它工作正常 现在我想在上传百分比数据时显示进度条 但百分比很快显示到 100 百分比 并且需要更多时间上传 最后到达后执行方法 protected class upload images extends AsyncT
  • 如何使 Django 的“DATETIME_FORMAT”处于活动状态?

    应该在哪里DATETIME FORMAT放置以使其发挥作用 在 Django 管理站点中显示日期时间 Django 的自动管理界面 文档用于DATETIME FORMAT 页上http docs djangoproject com en 1
  • 从 pyaudio-stream 获取浮点数形式的音频样本

    由于我目前正准备构建一个基于 Raspberry Pi 的设备 用于测量声卡记录的噪声 例如方差 中的一些内容 并尝试在 python 中执行此操作 所以我陷入了如何获取音频样本的困境中用于进一步计算的浮点数 我做了什么 使用线路输入适配器
  • 如何将 telnet 控制台日志重定向到文件 Linux

    我想将 telnet 控制台日志重定向到 Linux 中的文件 例如 telnet someIp gt someFile ls exit 我希望控制台日志保存在文件名中someFile 我在用tcl用于自动化此操作 截至目前 我正在做spa
  • 使用带有 Kerberos 身份验证的 impyla 客户端连接到 Impala

    我在 W8 机器上 使用 Python Anaconda分布 连接到Impala in our Hadoop集群使用Impyla包裹 我们的 hadoop 集群是通过以下方式保护的Kerberos 我已遵循API参考如何配置连接 from
  • 如何更改 Eclipse 中的*默认*默认编码?

    每次创建新工作区时 Eclipse 都会默认使用 Cp1250 编码 每当我创建项目的新分支并切换到 Eclipse 中的新工作区时 我需要转到窗口 gt 首选项 gt 常规 gt 工作区 文本文件编码并手动切换到 其他 UTF 8 如果我
  • 如何对使用 thymeleaf 的安全控制器进行单元测试(不会出现 TemplateProcessingException)?

    我正在尝试使用 spring security 和一个简单的家庭 根 控制器在 spring boot 中运行单元测试 该控制器使用 thymeleaf 进行模板处理 我正在尝试编写一些单元测试来验证我的安全权限是否正常工作以及我的模板 使
  • 更改不可变对象 F#

    我认为这个标题是错误的 但无法创建一个能够抽象地反映我想要实现的目标的标题 我正在编写一个调用服务并以 JSON 字符串形式检索数据的函数 该函数使用 a 来解析字符串JSON 类型提供者 在某些情况下 我想修改该 JSON 对象的属性 然
  • 如何使 Tomcat 中的所有会话过期?

    我想使 Tomcat 中的所有会话过期 我们在 Fitnesse 下测试我们的产品 并且仍然保留一些会话 会话结束会导致测试之间存在依赖性 我使用以下代码手动完成此操作 但仍然存在一些会话 我可以使用http localhost 8080
  • 寻找一个好的 jQuery 数据网格插件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要让我的用户维护一些帐户和住宿 每个帐户可以1到多个住宿 每个住宿仅链接到1个帐户 我希望能够让用户编辑帐户详细信息 在同一页面上 我想列出链接
  • 以超级用户身份从 python 脚本运行命令

    因此 我试图使用子进程从 python 脚本中获取一个以超级用户身份运行的进程 在 ipython shell 中类似 proc subprocess Popen sudo apach2ctl restart shell True stdi
  • 将文件添加到 CMake 但不编译它们

    我的公司有自己的 idl 编译器 并且我让 CMake 生成文件作为构建过程的一部分 我希望 idl 文件位于 Visual Studio 项目中 但这意味着我最终会遇到微软尝试使用 midl 编译 idl 文件 失败得很惨 我知道我的问题
  • Emacs 热键对齐等号

    我想在我的 emacs 中添加这样的内容 local set key kbd C c a lambda interactive align regexp region beginning region end 但每当我运行它时 我都会收到错
  • 如何将napi_threadsafe_function用于NodeJS Native Addon

    我一直在寻找NAPI文档尝试并理解它是如何处理的multithreading 根据文档napi create threadsafe function and napi call threadsafe function 用于创建和调用js f
  • 数学问题:根据外角半径/厚度确定内边框的角半径

    这是数学高手的数学 几何问题 不是我最强的科目 这是针对 WPF 的 但应该足够通用 可以解决以下问题 我有两个嵌入式边框元素 外部元素具有一定的角半径 R和边框厚度 T 给定这两个值 内边框的角半径应该是多少 R 设置为使得两个角边缘相交
  • ColdFusion 9中文件上传的脚本函数

    ColdFusion 9 中是否有与 cffile action upload 等效的 cfscript 查了一下文档 好像没有 更新 这是9 0 1更新中添加的http help adobe com en US ColdFusion 9
  • 如何将自定义身份验证提供程序集成到 IdentityServer4 中

    是否可以以某种方式扩展 IdentityServer4 来运行自定义身份验证逻辑 我需要根据几个现有的自定义身份系统验证凭据 并且很难找到扩展点来执行此操作 他们使用自定义协议 所有这些现有系统都具有客户端知道的 API 密钥的概念 Ide