Невозможно выйти из системы с помощью Google Chrome Frame и Windows Authentication

У меня есть приложение MVC 4, которое использует проверку подлинности Windows. Моя текущая задача состоит в том, чтобы предоставить пользователям кнопку выхода из системы. Я могу добиться этого в прямом Chrome, в прямом IE, но когда я добавляю Google Chrome Frame(GCF) в смесь, у меня, похоже, возникают проблемы.

Я использую IE9 с GCF.

Когда я пытаюсь отправить запрос AJAX, вот что говорит мне трассировка сети GCF:

Запрос:

GET http://103581:107674@linkToMySite/LogOff401?_=1369312905224 HTTP/1.1
Accept: */*
Referer: http://LinkToMySite
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36
Authorization: user:pass

К сожалению, ответ не получается. Инструменты разработчика Chrome его забирают, но я думаю, что IE блокирует запрос от его отправки, поскольку Fiddler его не видит. Я в растерянности и уже несколько дней устраняю неполадки, не зная, стоит ли сообщать об этом Google как об ошибке.

Это код выхода со стороны клиента (адаптация отсюда http://trac-hacks.org/wiki/TrueHttpLogoutPatch):

function LogMeOut(url) {
    try {
        document.execCommand("ClearAuthenticationCache");
        SendAJAXLogout(url);
    }
    catch(err){
        try {
            SendAJAXLogout(url);
        } catch(err) {
            log("Unable to log this user out.");
        }
    }
    window.location.href = url;
}

function SendAJAXLogout(url) {
    $.ajax(url, {
        username: GetRandomNumber(10000, 99999),
        password: GetRandomNumber(10000, 99999),
        beforeSend: function (req) {
            req.setRequestHeader('Authorization', "user:pass");
        },
        cache: false,

        error: function (jqXHR, textStatus, errorThrown) {
            //alert("Error: " + textStatus);
            log("I'm logged out now");
        }
    });
}

Это метод действия на стороне сервера, который я получил в другом месте, но не могу найти ссылку (я не писал это):

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOff401(string id)
{
    // if we've been passed HTTP authorisation
    string httpAuth = this.Request.Headers["Authorization"];
    if (!string.IsNullOrEmpty(httpAuth) &&
        httpAuth.StartsWith("basic", StringComparison.OrdinalIgnoreCase))
    {
        // build the string we expect - don't allow regular users to pass
        byte[] enc = Encoding.UTF8.GetBytes(id + ':' + id);
        string expected = "basic " + Convert.ToBase64String(enc);

        if (string.Equals(httpAuth, expected, StringComparison.OrdinalIgnoreCase))
        {
            return Content("You are logged out.");
        }
    }

    // return a request for an HTTP basic auth token, this will cause XmlHttp to pass the new header
    this.Response.StatusCode = 401;
    this.Response.StatusDescription = "Unauthorized";
    this.Response.AppendHeader("WWW-Authenticate", "basic realm=\"My Realm\"");

    return Content("Force AJAX component to sent header");
}

0 ответов

Другие вопросы по тегам