c# - 动态链接导致注销
问题描述
我有一个使用股票身份模型进行用户登录的 .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>
我知道有很多方法可以创建这样的动态链接,并且我尝试了几种方法,但是这个简化版本复制了我的问题。
提前感谢您对此问题的任何见解。
解决方案
我终于弄清楚了我的问题的根源,我发现我原来的问题中缺少一个关键细节。我将其发布为答案,以防其他人遇到同样的问题,因此我有足够的空间来扩展我的解释。我的开发和测试环境有不同的 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>");
谢谢。
推荐阅读
- docker - 为什么 Docker 入口点脚本不在分离模式下执行?
- matrix - 在 ARKit 中将屏幕点取消投影到水平面
- java - 连接多个设备时如何将 Appium 服务器保持在其分配的 AppiumDriver 上
- android - 如何修复错误:不兼容的类型:tab1 无法转换为 Fragment?
- python-3.x - 将列表中的每个项目写入具有自动分配文件名的单独 txt 文件(python = 3.6)
- php - PHP 将变量封装为字符串
- android - androidx.mediarouter 抱怨 MediaBrowserCompat
- mongodb - 尝试连接mongodb单节点副本集超时异常
- postgresql - 优化名称重复数据删除查询
- java - 任何允许 Pivot 中的撇号 SQL 列别名的安全问题?