将自定义标头值传递给 IdentityServer4 Login

2024-04-27

当用户尝试登录时,我尝试将自定义标头值(无 cookie)传递给 IdentityServer4。这是所有设置的方式。

自定义身份验证属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private readonly string _customId;

    public CustomAuthorizeAttribute(string customId)
    {
        _customId = customId;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        context.HttpContext.Request.Headers.Add("X-CustomId", _customId);
    }
}

控制器:

[CustomAuthorize("0123456789")]
    public IActionResult Secure()
    {
        ViewData["Message"] = "Secure Page.";

        return View();
    }

身份服务器 > 帐户控制:

[HttpGet]
    public async Task<IActionResult> Login(string returnUrl)
    {
        var customId = _httpContextAccessor.HttpContext.Request.Headers["X-CustomId"];

        // build a model so we know what to show on the login page
        var vm = await BuildLoginViewModelAsync(returnUrl);

        if (vm.IsExternalLoginOnly)
        {
            // we only have one option for logging in and it's an external provider
            return await ExternalLogin(vm.ExternalLoginScheme, returnUrl);
        }

        return View(vm);
    }

自定义标头值永远不会到达任何登录端点。想知道是否有人以前遇到过这个问题并且有任何想法如何让它发挥作用?非常感谢


您可以将自定义参数传递给授权端点。如果您使用的是 OpenID Connect Middleware ,您可以将该值添加到授权请求的查询字符串中OnRedirectToIdentityProvider功能 :

 services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
            .AddCookie("Cookies")

            //hybrid flow
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = "http://localhost:62888/";
                options.RequireHttpsMetadata = false;

                options.ClientId = "mvc2";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";

                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("api1");
                options.Scope.Add("offline_access");
                options.Events.OnRedirectToIdentityProvider = async n =>
                {
                    var headerValue = n.HttpContext.Request.Headers["X-CustomId"];

                    n.ProtocolMessage.SetParameter("X-CustomId", headerValue.ToString());

                    await Task.FromResult(0);
                };
            });

然后在登录页面,您可以轻松获取查询字符串:

    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string returnUrl = null)
    {

        var queryString = HttpContext.Request.Query["returnUrl"].ToString();
        // Clear the existing external cookie to ensure a clean login process
        await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

        ViewData["ReturnUrl"] = returnUrl;
        return View();
    }

Then prase the queryString to get value of X-CustomId: enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将自定义标头值传递给 IdentityServer4 Login 的相关文章

随机推荐

  • 如何向 CellList 添加或删除单个元素?

    如何添加 删除单个元素CellList http google web toolkit googlecode com svn javadoc 2 1 com google gwt user cellview client CellList
  • 在github上打开时如何更改Visual Studio的版本

    我有VS2015和VS2017 当我在 GitHub 上选择 在 Visual Studio 中打开 时 我想将其更改为使用 VS2017 而不是 VS2015 我怎样才能做到这一点 通过另一个问题找到了答案 使用 github 时 找不到
  • 在 Neo4j 中可视化连接的组件

    我可以使用下面的代码找到图中最密集连接的组件 CALL algo unionFind stream pnHours YIELD nodeId setId groupBy setId storing all node ids of the s
  • 如何同时(并行)调用远程计算机上的相同功能

    我正在编写一个脚本 该脚本具有多个需要时间在不同远程计算机上执行的函数 有什么方法可以以并行方式同时调用命令它们吗 举个例子将不胜感激 谢谢 Invoke Command已经对每台计算机并行执行调用 作为内置功能的一部分 https tec
  • 如何从 AngularJS 中的自定义指令 * 具有自己的作用域 * 访问父作用域?

    我正在寻找访问指令中 父 范围的任何方式 范围 嵌入 要求 从上面传入变量 或范围本身 等的任何组合 我完全愿意竭尽全力 但我想避免一些完全hacky或无法维护的东西 例如 我知道我现在可以通过采取 scope从 preLink 参数并迭代
  • 如何通过guard angular2隐藏链接

    如何在视图 html 中隐藏管理链接 我必须守护 管理员和经理 路由器配置 path manager component ManagerComponent canActivate ManagerGuard path user compone
  • Jenkins 在解析 pom 时失败

    我的 Jenkins 服务器上的一项作业出现问题 在 pom 解析期间失败并显示以下消息 Parsing POMs Modules changed recalculating dependency graph workspace java
  • 水平计数加工织物中的白色簇

    我对织物材质进行了处理 得到如下图所示的图像 原图 处理后的图像 现在 我想找到连续的白色簇的数量 如果所有簇都是均匀且完全水平的 我将运行一个循环来计算强度的上升和下降 以找到簇的数量 但事实并非如此 如果我通过上述方法取几行的中值 平均
  • 如何合并 jQuery 数据表 excelHtml5 中列的匹配值

    当我从数据表导出 Excel 时 我无法合并 col 值 由于列的值B named Category 需要合并重复值 我是编程新手 感谢任何帮助 这是我的我的jsfiddle https jsfiddle net t1j6rzg8 2 这是
  • Drupal - 使用引导程序检查 Drupal 之外的登录用户不起作用

    我正在绞尽脑汁地想弄清楚这个问题 在 Drupal 目录之外时 我无法让 Bootstrap 正常工作 如果我在 Drupal 目录中运行此代码 它可以正常工作 但向上一级不起作用 我的 Drupal 路径是 public html dru
  • 博耶摩尔算法的实现?

    有 C 语言的 Boyer Moore 字符串搜索算法的工作示例吗 我浏览了一些网站 但它们似乎有很多问题 包括维基百科 Thanks 子字符串搜索算法的最佳网站 http igm univ mlv fr lecroq string htt
  • 为什么不能使用与数组声明分开的数组初始化语法?

    我可以用一个整数来做到这一点 int a a 5 但我不能用整数数组来做到这一点 int a a 1 2 3 4 5 Why not 澄清 我不是在寻找正确的语法 我可以查找 我知道这有效 int a 1 2 3 4 5 这相当于 int
  • 即使没有任何更改,Makefile 也始终不是最新的

    我有一个包含两个文件夹的目录 src and binmakefile 位于根目录 即使没有更改 此 makefile 也会持续编译 不是最新的 我在这个 makefile 中遗漏了什么吗 all make a b a src a cpp g
  • Xcode:“此时无法安装此应用程序。”

    使用我的第一个应用程序进行学习 一切顺利 但 Xcode 遇到了问题 当我尝试在 iPhone 模拟器上运行该应用程序时 总是弹出此消息 此时无法安装此应用程序 怎么了 尝试构建应用程序时没有错误 已尝试清理构建 重新安装 Pod 重新启动
  • Team City 构建失败不返回失败代码

    我有一个在 TeamCity 上运行 Invoke MsBuild 的 powershell 脚本 在构建过程中 我看到其中一个项目出现 警告 构建失败 然而 teamcity 最后表示构建成功 如何强制 TC 退出并显示错误代码或至少报告
  • 如何在 rspec 请求规范中设置请求标头?

    在控制器规范中 我可以像这样设置 http 接受标头 request accept application json 但在请求规范中 请求 对象为零 那么我在这里该怎么做呢 我想将 http 接受标头设置为 json 的原因是这样我可以这样
  • corona sdk中拖动物理对象

    我尝试在场景中拖动重力 0 0 的动态主体 我有一个主体类型为动态的正方形 以及一个主体类型为静态的图像 但是当将方形拖动到图像上时 它会产生一点力 但是可以超出图像并传递到另一边 如图所示 这是我拖动正方形的代码 local functi
  • 如何使用Intent限制录音时间?

    使用意图时如何限制录制 我尝试了这段代码 Intent intent new Intent MediaStore ACTION VIDEO CAPTURE intent putExtra android intent extra durat
  • Web 服务 Android 应用程序:无法序列化 1.0

    P S 我看过类似的问题 但无法理解该怎么做 他们谈论使用元帅类 我似乎无法理解 我正在创建一个安卓应用 to 使用 JAX WS 我正在使用ksoap 2图书馆同样如此 我在一系列文本字段中获取用户的输入 并将这些输入传递到 WebSer
  • 将自定义标头值传递给 IdentityServer4 Login

    当用户尝试登录时 我尝试将自定义标头值 无 cookie 传递给 IdentityServer4 这是所有设置的方式 自定义身份验证属性 AttributeUsage AttributeTargets Class AttributeTarg