ASP .NET Core webapi在中间件中设置cookie

2023-11-26

我试图在执行操作后设置一个 cookie,努力使其工作。如果我从控制器而不是中间件设置它,我就能看到cookie。 我已经按照配置顺序进行了操作,但什么也没有。 代码示例来自一个干净的 webapi 创建的项目,所以如果有人想玩它很简单,只需创建一个空的 webapi,添加 CookieSet 类并将 Startup 类替换为下面的类(仅添加 cookie 策略选项)

这是我的中间件

public class CookieSet
{
    private readonly RequestDelegate _next;

    public CookieSet(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        await _next.Invoke(context);
        var cookieOptions = new CookieOptions()
        {
            Path = "/",
            Expires = DateTimeOffset.UtcNow.AddHours(1),
            IsEssential = true,
            HttpOnly = false,
            Secure = false,
        };
        context.Response.Cookies.Append("test", "cookie", cookieOptions);
    }
}

我添加了 p 赋值并检查执行是否永远不会到达那里,在 Cookies.Append 行上它停止执行,所以发生了一些我无法弄清楚的事情。

这是我的启动课程

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;
            options.HttpOnly = HttpOnlyPolicy.None;
            options.Secure = CookieSecurePolicy.None;
            // you can add more options here and they will be applied to all cookies (middleware and manually created cookies)
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseCookiePolicy(new CookiePolicyOptions
        {
            CheckConsentNeeded = c => false,
            HttpOnly = HttpOnlyPolicy.None,
            Secure = CookieSecurePolicy.None,
            MinimumSameSitePolicy = SameSiteMode.None,
        });

        app.UseMiddleware<CookieSet>();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();
    }
}

我已将所有选项设置为最低要求,用 chrome 和 fiddler 进行了测试,但什么也没有。


好吧,我是在自言自语,但这是为了社区......

在深入研究 AspNetCore 代码后得到了这个工作。 基本上,cookie 必须在上下文响应的回调 OnStarting 上设置。 这是实现这个技巧的中间件的代码

public class CookieSet
{
    private readonly RequestDelegate _next;
    private readonly ASessionOptions _options;
    private HttpContext _context;
    public CookieSet(RequestDelegate next, IOptions<ASessionOptions> options)
    {
        _next = next;
        _options = options.Value;
    }

    public async Task Invoke(HttpContext context)
    {
        _context = context;
        context.Response.OnStarting(OnStartingCallBack);
        await _next.Invoke(context);
    }

    private Task OnStartingCallBack()
    {
        var cookieOptions = new CookieOptions()
        {
            Path = "/",
            Expires = DateTimeOffset.UtcNow.AddHours(1),
            IsEssential = true,
            HttpOnly = false,
            Secure = false,
        };
        _context.Response.Cookies.Append("MyCookie", "TheValue", cookieOptions);
        return Task.FromResult(0);
    }
}

AspNetCore 团队为此使用了一个内部类。

检查SessionMiddleware类,部分代码如下(为了答案删除了很多东西):

public class SessionMiddleware
{
    public async Task Invoke(HttpContext context)
    {
        // Removed code here

        if (string.IsNullOrWhiteSpace(sessionKey) || sessionKey.Length != SessionKeyLength)
        {
                        // Removed code here
            var establisher = new SessionEstablisher(context, cookieValue, _options);
            tryEstablishSession = establisher.TryEstablishSession;
            isNewSessionKey = true;
        }

        // Removed code here

        try
        {
            await _next(context);
        }

        // Removed code here
    }

    //Now the inner class

    private class SessionEstablisher
    {
        private readonly HttpContext _context;
        private readonly string _cookieValue;
        private readonly SessionOptions _options;
        private bool _shouldEstablishSession;

        public SessionEstablisher(HttpContext context, string cookieValue, SessionOptions options)
        {
            _context = context;
            _cookieValue = cookieValue;
            _options = options;
            context.Response.OnStarting(OnStartingCallback, state: this);
        }

        private static Task OnStartingCallback(object state)
        {
            var establisher = (SessionEstablisher)state;
            if (establisher._shouldEstablishSession)
            {
                establisher.SetCookie();
            }
            return Task.FromResult(0);
        }

        private void SetCookie()
        {
            var cookieOptions = _options.Cookie.Build(_context);

            var response = _context.Response;
            response.Cookies.Append(_options.Cookie.Name, _cookieValue, cookieOptions);

            var responseHeaders = response.Headers;
            responseHeaders[HeaderNames.CacheControl] = "no-cache";
            responseHeaders[HeaderNames.Pragma] = "no-cache";
            responseHeaders[HeaderNames.Expires] = "-1";
        }

        // Returns true if the session has already been established, or if it still can be because the response has not been sent.
        internal bool TryEstablishSession()
        {
            return (_shouldEstablishSession |= !_context.Response.HasStarted);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP .NET Core webapi在中间件中设置cookie 的相关文章

  • 如何使 EF-Core 使用 Guid 而不是字符串作为其 ID/主键

    当我查看 ASP NET 3 Identity 时 它使用string而不是一个Guid为唯一的主键 In my Entity Framework code first Users ApplicationUser类I继承Identity类
  • ASP.NET Core/MVC 6 ViewModel 中的依赖注入 (DI)

    我使用构造函数注入在控制器中成功使用了 ASP NET 5 MVC 6 DI 我现在有一个场景 我希望我的视图模型在实现 IValidatableObject 时在 Validate 方法中使用服务 ViewModel 中的构造函数注入不起
  • Asp.net core 2.1 OpenIdConnectOptions 范围不起作用

    请告诉我为什么我无法添加任何范围OpenIdConnectOptions 它不适用于 ASP NET Core MVC 客户端 但使用 js 客户端则可以正常工作 我的代码 身份服务器4客户注册 public static IEnumera
  • 如何检查 Azure Blob Storage V12 中是否存在容器

    以前使用 Azure Blob Storage SDK V11 时 如果您想要创建容器但不确定该容器是否存在 可以使用 CreateIfNotExists 然而在版本 V12 中 CreateIfNotExists 不再可用 我能从 Mic
  • Rails 渲染 JSON - 会话丢失?

    我正在尝试对控制器进行一些 Ajax 调用 该控制器以 JSON 进行响应 if session user render json gt Some Data else render json gt You are not logged in
  • 安全 Cookie?

    我正在慢慢地将我的 未发布的 CMS 从 SESSION to COOKIE 互联网上的内容似乎更偏向于 SESSION 我认为是因为易于使用 我正在寻找有关保存 cookie 的安全提示 目前 我正在以以下格式存储 有点类似于 WordP
  • index.g.cshtml 在哪里

    我正在尝试完成本教程 但是 通常 当我构建解决方案时 我会得到一个CS0234错误指出文件中缺少命名空间Index g cshtml cd 但是这个文件存在于哪里呢 我努力了 所有构建 清理 重建解决方案选项 我已重新启动 Visual S
  • iOS 中如何清除特定域的 cookie?

    我已经搜索了 StackOverflow 上的几乎所有问题来寻找我的问题的答案 我还没有找到任何有用的链接或教程来说明哪种方式最好清除特定域的 cookie 如果有人可以帮助我 请 我自己找到了解决方案 如果您想删除 UIWebView 中
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • setcookie with expire=0 浏览器关闭后不会过期

    我使用setcookie来制作一个过期 0的cookie 从 PHP 文档来看 link http php net manual en function setcookie php cookie 过期的时间 这是一个 Unix 时间戳 所以
  • 编写每个处理程序中间件

    我希望从处理程序中提取一些重复的逻辑 并将其放入一些每个处理程序的中间件中 特别是 CSRF 检查 检查现有会话值 即身份验证或预览页面 等 我读了关于此的几篇文章 http justinas org writing http middle
  • ASP.NET Core 基于自定义策略的授权 - 不清楚

    好的 ASP NET Core 中基于自定义策略的授权 我有点理解这个新身份框架的想法 但仍然不是 100 清楚你可以用它实现什么 假设我们在 HomeController 中有一个名为 List 的 Action 此操作将查询并显示数据库
  • asp.net core / kestrel中的线程管理

    我正在解决我们已迁移到 asp net core 2 0 的 asp net 应用程序的性能 可扩展性问题 我们的应用程序作为应用程序服务托管在 azure 上 并且在任何中等流量的情况下都很容易崩溃 让我困惑的一件事是如何处理多个并发请求
  • SSL 和会话劫持/固定

    快问 SSL 是否完全防止会话劫持 固定 谢谢 不可以 例如 在以下情况下可能会发生劫持 被黑客入侵的 CA 根签署无效证书 该证书可用于发起中间人攻击 被黑客攻击的域名所有者电子邮件收件箱使黑客有可能购买经过域名验证的证书 错误的密钥策略
  • Django-多个端口上的会话 cookie 和站点

    我有多个 Django 项目在一台服务器上运行 使用gunicorn http gunicorn org and nginx http wiki nginx org 目前 它们都被配置为使用 nginx 中的服务器指令在同一 IP 地址的唯
  • 从.net Core WebApi中的startup.cs访问HttpContextAccessor

    我正在将异常记录到 asp net core 中的数据库中 MyDbContext 采用 HttpContextAccessor 参数 因此 我将 HttpContextAccessor 发送到 MyDbContext cs 以访问我的 J
  • 应用程序找不到位于另一个项目中的 Razor 页面

    我正在从事 Razor Pages 项目 该解决方案由多个项目组成 即 Server 它管理依赖注入的服务 是一个启动项目 应用程序 包含索引页面和共享组件 以及多个 模块 项目 它们是站点的独立区域 我需要向该解决方案添加新模块以及登陆页
  • 如何从asp net core中的AuthorizationFilter重定向到登录页面?

    当我回来时ForbidResult 它重定向到AccessDenied启动时指定的页面 我想做同样的事情UnauthorizedResult 但重定向到Login page P S 我没有使用标准Authorize控制器中的属性我有自己的
  • VSTS/TFS设置环境变量ASP.NET core

    我正在尝试使用 VSTS 将 ASP NET Core 应用程序部署到 IIS 并执行以下任务 然而 经过多次谷歌搜索和浏览 MS 文档后 我找不到为部署设置环境变量的方法 我在环境范围的发布定义中设置的变量未设置为环境变量 知道如何实现这
  • 将自定义 SignInResults 添加到从 SignInManager PasswordSignInAsync 返回的内容中

    我想保证我的所有登录用户都签署了我们的 EULA 对我来说 它类似于内置的SignInResult TwoFactorRequired 因为我想在完成登录之前让他们完成 EULA 签署流程 有谁知道任何显示如何创建自定义的资源SignInR

随机推荐

  • 如何在SVN中找到两个分支的共同祖先?

    想象一下 您有一棵巨大的 SVN 树 树枝遍布各处 有树干 有树枝 这些树枝有树枝 等等 那么 给定树中的两个树枝 如何找到共同的祖先 我知道你可以简单地获取完整的日志并进行比较 但是如果你的主干有 75 000 个修订 并且大多数时候你确
  • 在 SpriteKit 中移动相机

    UPDATE已添加更新的代码 其工作原理符合我的预期 请参阅下面更新的代码中的 didSimulatePhysics 方法 就我而言 我只关心在 x 轴上向左或向右移动字符 其中 x 轴上的 0 是绝对左侧 x 轴上的右侧是可配置值 苹果的
  • Set-MsmqQueueACL - 允许 - 无法按照文档使用列表?

    我正在尝试使用 Powershell v5 1 Win2k16 在 Msmq 队列上设置 ACL 但即使我遵循文档 我仍然收到错误 Get MsmqQueue Name s009 ClientsServiceBus QueueType Pr
  • 如何在服务器端获取 HTTP POST 请求正文作为 Java 字符串?

    HttpExchange 对象的 getRequestBody 方法返回一个 InputStream 正确解读 正文 还有很多工作要做 它是一个 Java 库 对象 方法 向前迈出一步并将主体 在服务器端 作为现成的 Java 字符串返回
  • 如何在没有 glDrawPixels 的情况下将缓冲区对象渲染/绘制到帧缓冲区

    根据 opengl 规范 4 0 glDrawPixels 已被弃用 对于 cuda 互操作性 似乎最好使用 opengl 缓冲区对象 替代方案可以是纹理或表面 但它们存在缓存 并发问题 因此无法用于我的 cuda 内核 我只是想创建一个
  • 为什么我们使用finally块? [复制]

    这个问题在这里已经有答案了 据我所知 以下两个代码片段都具有相同的目的 为什么有finally完全阻塞吗 Code A try Some code catch Exception handling code finally Cleanup
  • 什么是锯齿状数组?

    什么是锯齿状数组 在 C 中 任何例子以及何时应该使用它 交错数组是数组的数组 string arrays new string 5 这是五个不同字符串数组的集合 每个数组的长度都可以不同 它们也可以是相同的长度 但重点是没有保证他们就是
  • ScrollViewer 上 VerticalOffset 属性的双向绑定?

    我在 Silverlight 3 0 中有一个视图和一个视图模型 该视图包含一个标准的 ScrollViewer 其中包含动态内容 根据 ScrollViewer 中的内容 用户可能已向下滚动内容一半 然后执行导致 ScrollViewer
  • 使用 CSS @font-face 时,浏览器按什么顺序使用不同类型?

    使用时 font faceCSS 中是否记录了每种主要浏览器中适用的字体类型 以及如果缺少一种或多种字体类型 它们对不同字体类型的优先级 我尝试用谷歌搜索答案 但失败了 font face font family myfont src ur
  • 将 int 转换为 BCD 字节数组

    我想使用 BCD 将 int 转换为 byte 2 数组 所讨论的 int 将来自表示年份的 DateTime 并且必须转换为两个字节 是否有任何预制函数可以执行此操作 或者您能给我一个简单的方法来执行此操作吗 example int ye
  • AlertDialog 按钮的图像

    是否可以添加drawables到positive negative and neutralAlertDialog 的按钮 如果是 那么如何 Since onPrepareDialog已弃用 您可以使用onShowListener反而 此外
  • ForbiddenError:无效的 csrf 令牌,express js

    我试图让 csurf 工作 但似乎偶然发现了一些东西 到目前为止的代码如下所示 索引 ejs
  • T-SQL 输出子句:如何访问旧的身份 ID

    我有一个 T SQL 语句 它基本上执行插入并将一些插入的值输出到表变量以供以后处理 有没有办法让我将所选记录的旧身份 ID 存储到我的表变量中 如果我使用下面的代码 我会得到 无法绑定多部分标识符 a ID 错误 DECLARE act
  • 如何使用 ACTION_VIDEO_CAPTURE 操作对相机的意图将文件的输出设置为 mp4?

    当我使用本机应用程序相机拍摄视频时 输出文件的扩展名为 3gp 我需要使用 ACTION VIDEO CAPTURE 意图操作来意图相机 这将生成一个具有 mp4 文件扩展名的文件 我该怎么做 您可以继续尝试 dis 代码 intent n
  • Swagger PHP - 如何定义嵌套属性?

    我正在使用 Swagger PHP 大多数定义都很容易定义 但我遇到了一个特定数据块的问题 该数据块不属于单独的类 而是属于关联数组 我希望显示的 json 响应 针对此问题进行了简化 id 1 status published gps l
  • ipython %timeit“赋值前引用的局部变量‘a’”

    我正在尝试运行以下代码 但我得到了local variable a referenced before assignment a x for x in range 10 b x for x in range 10 timeit a b 该语
  • 如何重新启动 git 仓库?

    我从我的一个旧项目中获取了一个存储库 并编辑了这些文件 以便我可以将其用作新项目的 骨架 说我在这里 骨架 框架 我已经在那里编辑了存储库 我将如何使用该目录中的这些文件重新启动此存储库 什么should我已经做好了 我所做的就是拉取存储库
  • jQuery 单击处理函数不会在 DOM 加载后添加的元素上触发

    我相信我可以使用 live 来做到这一点 但该方法已被弃用 问题是这样的 我有一个点击处理函数 它应该在任何具有 myClickEl 类的元素上触发 这对于加载时文档中存在的 myClickEl 元素效果很好 但是 如果我在 DOM 加载后
  • Spring配置C3P0与Hibernate?

    我有一个 Spring JPA 应用程序 其中 Hibernate 作为 JPA 提供者 我通过以下方式在 Spring 中配置了 C3P0 数据源
  • ASP .NET Core webapi在中间件中设置cookie

    我试图在执行操作后设置一个 cookie 努力使其工作 如果我从控制器而不是中间件设置它 我就能看到cookie 我已经按照配置顺序进行了操作 但什么也没有 代码示例来自一个干净的 webapi 创建的项目 所以如果有人想玩它很简单 只需创