Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我从子门户访问ashx时,为什么DNN会杀死我的身份验证cookie?_C#_Cookies_Dotnetnuke_Ashx - Fatal编程技术网

C# 当我从子门户访问ashx时,为什么DNN会杀死我的身份验证cookie?

C# 当我从子门户访问ashx时,为什么DNN会杀死我的身份验证cookie?,c#,cookies,dotnetnuke,ashx,C#,Cookies,Dotnetnuke,Ashx,我看到了一个非常严重的问题,它只发生在非管理用户身上 当用户登录并访问一个页面时,他们将从系统中注销。页面将完成加载,就像他们已登录一样,但一旦他们尝试任何其他操作(包括刷新浏览器页面),他们将被视为未登录,并显示登录提示 打开fiddler,我可以看到服务器的一个响应包含以下内容: 响应发送了71字节的Cookie数据: 设置Cookie:portalaliasid=;expires=Sat,1982年5月8日17:26:06 GMT;路径=/;HttpOnly 响应发送了69字节的Cooki

我看到了一个非常严重的问题,它只发生在非管理用户身上

当用户登录并访问一个页面时,他们将从系统中注销。页面将完成加载,就像他们已登录一样,但一旦他们尝试任何其他操作(包括刷新浏览器页面),他们将被视为未登录,并显示登录提示

打开fiddler,我可以看到服务器的一个响应包含以下内容:

响应发送了71字节的Cookie数据: 设置Cookie:portalaliasid=;expires=Sat,1982年5月8日17:26:06 GMT;路径=/;HttpOnly

响应发送了69字节的Cookie数据: 设置Cookie:portalroles=;expires=Sat,1982年5月8日17:26:06 GMT;路径=/;HttpOnly

响应发送了69字节的Cookie数据: 设置Cookie:.DOTNETNUKE=;expires=星期二,1999年10月12日04:00:00 GMT;路径=/;HttpOnly

响应发送了27字节的Cookie数据: 设置Cookie:language=;路径=/;HttpOnly

响应发送了33字节的Cookie数据: 设置Cookie:authentication=;路径=/;HttpOnly

这似乎总是发生在我访问自定义ashx web调用时。进行此调用的代码如下所示:

$('#lstStates').empty();
var selectedRegions = $('select[id*=lbxRegions]').val();

// Get the list of states for the selected regions
$.ajax({
    url: '/DesktopModules/MyModule/ashx/GetStatesForRegions.ashx',
    data: { regions: selectedRegions },
    dataType: 'json',
    success: function (data) {
        if (IsArray(data)) {
            for (var state in data) {
                $('#lstStates').append('<option>' + data[state] + '</option>');
            }
        }
    }
});
为什么要清除我的相关cookie并注销非管理员用户



编辑:更神秘的是,当您以非管理员身份访问ashx时,DNN似乎返回302 HTTP响应,再次将您重定向到同一url。302响应包含cookie清除数据。第二次访问ashx时(由于重定向),将返回正确的数据。

这是因为用户仅在子门户中定义,但对ashx的请求(从DNN的角度)在父门户中发生。当DNN收到请求时,它会发现您已“切换门户”,不再具有有效身份,并删除您的身份验证信息。超级用户不会出现这种情况,因为他们在两个门户中都有有效的身份

要解决此问题,您需要使用门户ID向请求中添加querystring参数。这让DNN消除请求的歧义并保持身份验证完整:

$.ajax({
    url: '/DesktopModules/MyModule/ashx/GetStatesForRegions.ashx?portalId=' + <%:PortalId%>,
    ....
});
$.ajax({
url:'/DesktopModules/MyModule/ashx/GetStatesForRegions.ashx?portalId='+,,
....
});

DNN大量使用会话;尝试在
IHttpHandler
之后添加
System.Web.SessionState.irerequiressessionstate
的实现,并查看其行为是否有任何不同。我验证了仅将某人设置为管理员并不能解决此问题。只有当用户是超级用户时,它才能正常工作。我会注意到这是在一个子门户上。当我输入最后一条评论时,我刚刚意识到。这很有道理,添加portalId可以解决这一问题。这也解释了为什么它不是在本地发生的,因为在本地这是一个单独的门户,而不仅仅是一个子门户。@KallDrexx您是否介意将问题的标题更新为子门户上的ashx,这样如果有人有类似的问题,它更有可能被搜索引擎找到?看来亲子交叉才是真正的问题,对吧?@GuthMD-谢谢你的标题建议-帮助我找到了我想要的!
$.ajax({
    url: '/DesktopModules/MyModule/ashx/GetStatesForRegions.ashx?portalId=' + <%:PortalId%>,
    ....
});