устранить ошибку аутентификации - PullRequest
0 голосов
/ 04 мая 2009

Симптом:
Некоторые пользователи не могут успешно POST, большинство могут успешно POST.
При возникновении ошибки пользователи перенаправляются на страницу общего доступа / ошибки сайта.

Используемые технологии:
IIS v6
Windows Server 2003
asp.net v3.5
asp.net MVC Framework v1.0
JQuery
* 1011 LINQ * SQL Server 2005

Аутентификация: Windows с AspNetActiveDirectoryMembershipProvider
Вот фрагмент web.config:

<authentication mode="Windows"/>
    <membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
    <providers>
            <add name="AspNetActiveDirectoryMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider,&#xA;                 System.Web, Version=2.0.3600.0, Culture=neutral,&#xA;                 PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADConnString" connectionUsername="" connectionPassword=""/>
        </providers>
    </membership>

Вот ссылка из вида, которая запускает Сохранить
<a href="javascript:void(document.frmCurrentLineItems.submit())" title="Saves this month only">Save This Month</a>

Вот некоторые из основанных на jQuery javascript:

$("form#frmCurrentLineItems").submit(function() {
    submitView(this);
    return false;
});

function submitView(form) {        
    $.ajax(
            {
                type: form.method,
                url: form.action,
                data: $(form).serialize(),
                dataType: "html",
                error: function(error) {
                    alert(error);
                }
            }
        );
}

Вот часть метода контроллера:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CurrentLineItems(FormCollection thisForm)
    // Get the forecast from the session
    BusinessLogic.ForecastBL thisForecast = (BusinessLogic.ForecastBL)HttpContext.Session["ForecastMetaData"];

        if (thisForecast != null)
        {
            // Run the save to db stuff here
            return View("CurrentLineItems", ViewData["LineItemSummary"]);
        }
        else
        {
            return Redirect("../Shared/Error");
        }

Примечание относительно приведенного выше кода ... Я почти уверен, что извлечение объекта прогноза из сеанса не вызывает ошибку, по крайней мере, я предполагаю, что это не потому, что сеанс истек, потому что пользователи, которые не может сохранить, не может сохранить, когда они открывают страницу и сразу же пытаются сохранить.

Класс также имеет следующие атрибуты:

[HandleError]
[Authorize]
public class ForecastController : Controller
{

Сайт имеет в свойствах IIS Методы аутентификации:
Включение анонимного доступа отключено и проверена встроенная проверка подлинности Windows.

Вот посмотрите журнал IIS от пользователя, который испытывает эту проблему:

466 2009-04-28 16:41:15 W3SVC1100645706 192.168.10.22 POST / Forecast / CurrentLineItems - 443 - XX.XX.XX.XX Mozilla / 4.0 + (совместимо; + MSIE + 7.0; + Windows + NT + 5.1; + GTB5; + .NET + CLR + 1.1.4322) 401 1 0
467 2009-04-28 16:41:15 W3SVC1100645706 192.168.10.22 POST / Forecast / CurrentLineItems - 443 ДОМЕН \ имя пользователя XX.XX.XX.XX Mozilla / 4.0 + (совместимо; + MSIE + 7.0; + Windows + NT + 5.1 + ; + GTB5; + .NET + CLR + 1.1.4322) 302 0 0
468 2009-04-28 16:41:15 W3SVC1100645706 192.168.10.22 GET / Shared / Error - 443 - XX.XX.XX.XX Mozilla / 4.0 + (совместимо; + MSIE + 7.0; + Windows + NT + 5.1; + GTB5; +. NET + CLR + 1.1.4322) 401 1 0
469 2009-04-28 16:41:16 W3SVC1100645706 192.168.10.22 GET / Shared / Error - 443 DOMAIN \ username XX.XX.XX.XX Mozilla / 4.0 + (совместимо; + MSIE + 7.0; + Windows + NT + 5.1 ; + GTB5; + .NET + CLR + 1.1.4322) 404 0 0

Вот те же строки, которые мы надеемся улучшить для удобочитаемости:
2009-04-28 16:41:15 POST / Forecast / CurrentLineItems - 443 - XX.XX.XX.XX 401 1 0
2009-04-28 16:41:15 POST / Forecast / CurrentLineItems - 443 DOMAIN \ username XX.XX.XX.XX 302 2009-04-28 16:41:15 GET / Shared / Error - 443 - XX.XX. XX.XX 401 1 0
2009-04-28 16:41:16 GET / Shared / Error - 443 ДОМЕН \ имя пользователя XX.XX.XX.XX 404 0 0

Только что заметил, что все запросы POST выглядят так, как указано выше ... за исключением того, что успешный возвращает 200 на втором POST ...

Так как мне определить причину первого POST, описанного выше ... тот, который делает это на веб-сервере без информации DOMAIN \ username и получает ошибку 401?

Также, почему ошибка 302?

Похоже, я прошу два сообщения POST ... но я не совсем понимаю, почему браузер отправляет два запроса POST? (конечно ... я подозреваю, что мой код, но не могу понять, почему.)

Буду признателен за любые способы устранения неполадок, помогающие отследить вышеуказанные ошибки.

Сейчас я смотрю на Устранение неполадок с ошибками HTTP 401 в IIS Правка ... это не помогло с моей проблемой

Ответы [ 2 ]

2 голосов
/ 10 мая 2009

Первые 401, которые вы получаете, являются частью схемы аутентификации NTLM, именно так IIS обрабатывает аутентификацию Windows. Запрос сделан, он возвращает 401, поэтому он снова пытается передать информацию аутентификации NTLM.

Итак, ваше первое сообщение приходит, получает 401, затем повторяет попытку аутентификации и получает 302. Это ваше перенаправление на страницу ошибки. Затем ваши страницы ошибок получают 401, повторяет попытку и получает 404.

Итак, у вас есть две проблемы, во-первых, это какой-то тип ошибки в вашем контроллере. Это может быть перенаправление нулевой проверки или другая ошибка, регистрируете ли вы свои ошибки? Кроме того, я бы выдал исключение вместо перенаправления ... тогда ваша логика handleError должна срабатывать и обрабатывать ее для вас.

Во-вторых, похоже, что ваша страница ошибок не существует или ваша маршрутизация испорчена.

0 голосов
/ 13 мая 2009

Изменение ссылки на кнопку / элемент ввода, похоже, решило эту проблему ...
<input type="submit" value="Save This Month" title="Saves this month only" class="submitBtn"/>

Поскольку кнопка ввода находится внутри формы, которую я хочу отправить ... она выполняет действие контроллера Post и сохраняет данные, а затем отображает представление ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...