我看到一个非常奇怪的问题,只发生在非管理用户身上。
当用户登录并访问一个页面时,他们将退出系统。页面完成加载,就像他们已登录一样,但一旦他们尝试任何其他操作(包括刷新浏览器页面),他们就会被视为未登录并显示登录提示。
打开提琴手,我可以看到来自服务器的响应之一包含以下内容:
响应发送了 71 字节的 Cookie 数据: Set-Cookie: portalaliasid=; expires=1982 年 5 月 8 日星期六 17:26:06 GMT;路径=/; HttpOnly
响应发送了 69 字节的 Cookie 数据:Set-Cookie:portalroles=; expires=1982 年 5 月 8 日星期六 17:26:06 GMT;路径=/; HttpOnly
响应发送了 69 字节的 Cookie 数据:Set-Cookie: .DOTNETNUKE=; expires=1999 年 10 月 12 日星期二 04:00:00 GMT;路径=/; HttpOnly
响应发送 27 字节的 Cookie 数据:Set-Cookie:language=; 路径=/; HttpOnly
响应发送了 33 字节的 Cookie 数据:Set-Cookie: authentication=; 路径=/; HttpOnly
当我访问我的自定义 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 响应,再次将您重定向到相同的 url。该 302 响应包含 cookie 清除数据。它第二次访问 ashx(由于重定向)返回正确的数据。