Перенаправление входа в систему не удается, если исходный URL содержит строку запроса - PullRequest
1 голос
/ 09 августа 2011

Мы используем проверку подлинности с помощью форм в веб-приложении ASP.Net 3.5 под IIS 7.5. Мы обнаружили, что когда на исходной странице есть строка запроса, подобная этой:

http://server/dir/page.aspx?func=add

Перенаправление со страницы входа выглядит, я отправляю на:

http://server/dir/page.aspx%3ffunc%3dadd

Несмотря на то, что этот URL декодируется до http://server/dir/page.aspx?func=add IIS жалуется на

HTTP Error 400.0 - Bad Request
ASP.NET detected invalid characters in the URL.

Мой Google-фу не смог меня исследовать. У кого-нибудь есть решение или указатель на дополнительную информацию?

Обновление:

Ответы на вопросы:

Да, мы вызываем FormsAuthentication.RedirectFromLoginPage.

Я посмотрел эту статью , и похоже, что это для IIs7 и Win28. При просмотре ссылок на исправленные файлы мои даты были более точными примерно на 3 года. Хотя я добавил reg-key, на который ссылаются, и перезагрузил коробку; все еще случается.

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

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

Как оказалось, я был не прав. Где мы звоним FormsAuthentication.RedirectFromLoginPage - это мертвый код, и перенаправление обрабатывается на стороне клиента после того, как служба аутентификации сообщает нам, что попытка была успешной.

Это был кусок кода, который не работал:

var queryStringParts = window.location.search.split('=');
var targetPath = queryStringParts[1];
targetPath = targetPath.replace(/(%2f)/g,'/'); // <-- Here's where we weren't doing enough

С тех пор я написал служебный метод для получения значения строки запроса и его правильной обработки.

function getQueryStringValue(name, defaultValue) {
    var value = defaultValue;
    var queryString = window.location.search;
    var startPos = queryString.indexOf(name);

    if (startPos > -1) {
        startPos += name.length + 1
        var endPos = queryString.indexOf('&', startPos);
        if (endPos == -1) {
            // Incase there is no ampersand (&) after the query string value 
            // we're after we go to the last index + 1
            endPos = queryString.length;
        }
        value = unescape(queryString.substring(startPos, endPos));
    }
    return value;
}
0 голосов
/ 09 августа 2011

Попробуйте добавить следующее в ваш web.config:

<system.web>
   <httpRuntime 
        requestValidationMode="2.0"
        requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\"
        relaxedUrlToFileSystemMapping="true"
    />       
</system.web>

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true" />
    </security>
</system.webServer>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...