对 IIS 服务器上托管的 .NET CORE 2.1 应用程序进行一次 AJAX 调用后,会话状态被清除或丢失

2024-05-05

我遇到了这个问题,我已经挠头好几个小时了。

问题:我创建的会话状态Login拨打电话后神秘清除或丢失API.NET CORE 2.1 中也包含控制器。当我打电话时会发生这种情况API方法看起来像:

    [Authorize(Policy = "AdminViewPolicy")]
    [HttpGet("GetAllUsersId")]
    public IActionResult GetAllUsersId()
    {
        var user = _userService.GetAllUsersId();
        return Ok(new
        {
            data = user
        });
    }

此方法的角色和其他方面工作正常。这就是我调用此操作方法的方式:

$.ajax({
    url: "https://www.someworkingwebsite.com/api/Users/GetAllUsersId",
    type: "GET",
    async: false,
    dataType: "json",
    contentType: "application/json",
    data: {},
    credentials: 'include',
    xhrFields: {
        withCredentials: true
    },
    beforeSend: function (xhr) {
        xhr.setRequestHeader("Authorization", window.localStorage.getItem("authToken"));
    },
    success: function (data) {
        console.log(data);
        var html = [];
        for (var i in data["data"]) {
            var id = data["data"][i]["fullName"] + "###" + data["data"][i]["uuid"] + "###" + data["data"][i]["id"];
            //var id = data["data"][i]["uuid"] + "###" + data["data"][i]["id"];
            html.push(id);
        }
        /*initiate the autocomplete function on the "searchInput" element, and pass along the countries array as possible autocomplete values:*/
        autocomplete(document.getElementById("searchInput"), html);
    },
    error: function () {
        console.log("Error" + data);
    },
});

我的 Startup.cs 配置为API项目看起来像:

public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
           services.Configure<CookiePolicyOptions>(options =>
               {
                   // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                   options.CheckConsentNeeded = context => false;
                   options.MinimumSameSitePolicy = SameSiteMode.None;
               });

            services.AddSession(options =>
            {
                options.IdleTimeout = TimeSpan.FromMinutes(30);

            });

            services.AddMvc(options =>
            {
                options.Filters.Add(typeof(ValidateModelAttribute));

            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddHttpContextAccessor();
}


    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
      //Other code omitted for brevity 
            app.UseForwardedHeaders();

            // global cors policy
            app.UseCors(x => x
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());

            app.UseAuthentication();
            app.UseSession();
    }

我的客户端过滤器用于检查Session好像:

public override void OnActionExecuting(ActionExecutingContext context)
{
    if (Context.Current.Session == null || !Context.Current.Session.TryGetValue("UserID", out byte[] val))
    {
        context.Result =
            new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Pages",
                action = "SessionTimeout"
            }));
    }
    base.OnActionExecuting(context);
}

事情变得棘手的部分。当我从我的设备调用 AJAX 函数时View,AJAX成功调用API方法并获取所需的数据,而且 AJAX 调用也会以某种方式清除我的会话,因为一旦我导航到其他页面或提交表单,SessionTimeout上面显示的属性被调用,我被踢出了系统。

我检查了网络浏览器上的所有控制台日志、网络请求、应用程序存储,但找不到罪魁祸首。我还检查了 API 和客户端中的逻辑,看看我是否犯了这个重大错误,但我找不到任何暗示这一点的东西。

自从API并且客户端托管在 IIS 服务器上,我想也许那个该死的环境可以做一些事情,但不,我也找不到任何人可以责怪那里。

经过一番折腾后,我终于决定向专业人士请教。如果有人能帮助我那就太好了hopefully解决我的这个问题。

感谢期待。


好的,关于这个问题,我找到的解决方案是更改每个相互交互的应用程序的会话 cookie 名称。

In Startup / Configure(),更改应用程序的cookie名称:

app.UseSession(new SessionOptions() { Cookie = new CookieBuilder() { Name = ".AspNetCore.Session.MyApp1"}});

我不太清楚为什么会发生这种情况。如果有人能够对这个问题有更多的了解,我将不胜感激。

谢谢,我希望这对面临类似问题的人有所帮助。

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

对 IIS 服务器上托管的 .NET CORE 2.1 应用程序进行一次 AJAX 调用后,会话状态被清除或丢失 的相关文章

  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax

随机推荐