首页 > 解决方案 > 动态链接导致注销

问题描述

我有一个使用股票身份模型进行用户登录的 .Net Core 2.1 应用程序。一个(MVC)页面有一个基于用户选择动态生成的链接列表。问题在于,使用新的浏览器会话(新打开的隐身窗口),一旦用户单击其中一个动态创建的链接,它们就会被带回登录屏幕。重新登录后,一切正常。用户可以单击这些链接,而不必再次登录。额外的复杂情况是,这只发生在项目发布到测试服务器时,而不是在开发中。我尝试在到达相关页面时刷新用户身份 cookie。我确认这有效,但并没有解决问题。这似乎与防伪cookie有关,但到目前为止,我所有的努力都失败了。

在视图中,如下所示的链接可以正常工作:

<a asp-action="action" asp-controller="controller">link 1</a>

但是,使用 JavaScript 动态引入链接确实会导致神秘的注销问题,如下所述:

<div id="test2"></div>

...

<script>
  $(document).ready(function () {
    $("#test2").html("<a href='/controller/action/'>link 2</a>");
  });
</script>

我知道有很多方法可以创建这样的动态链接,并且我尝试了几种方法,但是这个简化版本复制了我的问题。

提前感谢您对此问题的任何见解。

标签: c#asp.net-core

解决方案


我终于弄清楚了我的问题的根源,我发现我原来的问题中缺少一个关键细节。我将其发布为答案,以防其他人遇到同样的问题,因此我有足够的空间来扩展我的解释。我的开发和测试环境有不同的 Web 应用程序路径。出于这个原因,我编写了一个 JavaScript 函数来获取基本 url,然后再添加控制器和操作路径。在我的问题中,我将脚本简化为:

$("#test2").html("<a href='/controller/action/'>link 2</a>");

实际上更像是:

$("#test2").html("<a href='" + GetBaseUrl() + "controller/action/'>link 2</a>");

function GetBaseUrl() {
    return "//" + window.location.host + "/";
}

事实证明,这个小功能是罪魁祸首。我仍然不明白为什么它会导致问题(而且我不是 JavaScript 专家,所以可能有更好的方法来做到这一点),但这绝对是问题所在。

对于遇到此问题的其他任何人,如果脚本在页面或视图中,请使用:

$("#test2").html("<a href='@Url.Action("action", "controller")'>link 2</a>");

如果您尝试从链接脚本执行此操作,请使用相对路径,这取决于您的 site.js 所在的位置,但在我的情况下:

$("#test2").html("<a href='../../controller/action/'>link 2</a>");

谢谢。


推荐阅读