当我从子门户访问ashx时,为什么DNN会终止我的身份验证cookie?

时间:2012-05-08 17:57:56

标签: c# cookies dotnetnuke ashx

我看到一个非常奇怪的问题,只发生在非管理用户身上。

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

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

  

响应发送了71个字节的Cookie数据:       Set-Cookie:portalaliasid =; expires = Sat,08-May-1982 17:26:06 GMT;路径= /;仅Http

     

响应发送了69个字节的Cookie数据:       Set-Cookie:portalroles =; expires = Sat,08-May-1982 17:26:06 GMT;路径= /;仅Http

     

响应发送了69个字节的Cookie数据:       Set-Cookie:.DOTNETNUKE =; expires = Tue,12-Oct-1999 04:00:00 GMT;路径= /;仅Http

     

响应发送了27个字节的Cookie数据:       Set-Cookie:language =;路径= /;仅Http

     

响应发送了33个字节的Cookie数据:       Set-Cookie:authentication =;路径= /;仅Http

当我访问我的自定义ashx网络电话时,似乎总会发生这种情况。进行此调用的代码是以下javascript:

$('#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>');
            }
        }
    }
});

ashx中的代码是

public class GetStatesForRegions : IHttpHandler
{
    public bool IsReusable { get { return false; } }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";

        // Get the list of region ids from the GET request
        string[] ids;
        string regionsArray = context.Request["regions[]"] ?? string.Empty;
        ids = regionsArray.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        using (var dbContext = new MyDataContext())
        {
            string[] states;

            var query = dbContext.Schools.Where(x => x.PodRegionId != null);

            if (ids != null && ids.Length > 0)
                query = query.Where(x => ids.Contains(x.PodRegionId.ToString()));

            states = query.Select(x => x.xosAddress.State)
                          .Distinct()
                          .OrderBy(x => x)
                          .ToArray();

            context.Response.Write(JsonConvert.SerializeObject(states));
            context.Response.End();
        }
    }
}

为什么要清除相关的Cookie并注销非管理员用户?

<小时/> 编辑:为了添加神秘感,当您以非管理员身份访问ashx时,DNN似乎返回302 HTTP响应,再次将您重定向到同一个网址。 302响应是包含cookie清除数据的响应。第二次访问ashx(由于重定向),返回正确的数据。

1 个答案:

答案 0 :(得分:7)

这是因为用户仅在子门户中定义,但是在父门户中发生了对ASHX的请求(从DNN的角度来看)。当DNN收到请求时,它会看到您“切换了门户”,不再具有有效身份,并删除了您的身份验证信息。超级用户不会这样做,因为他们在两个门户网站上都有一个有效的身份。

要解决此问题,您需要使用门户网站ID为请求添加querystring参数。这让我们的DNN消除了请求的歧义并保持您的身份验证不变:

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