Как перенаправить на страницу входа в систему из веб-службы в вызове AJAX?

StackOverflow https://stackoverflow.com/questions/610699

Вопрос

Я использую jQuery для вызова методов веб-сервиса (* .asmx).Веб-служба использует FormsAuthentication, чтобы определить, аутентифицирован ли вызывающий пользователь.Я не могу вернуть код состояния перенаправления из веб-метода, например

[WebMethod(EnableSession=true)]
public Dictionary<string, object> GetArchivedFiles(int pageSize, int page)
{
    if(HttpContext.Current.User.Identity.IsAuthenticated && Session["UserId"] != null)
        // Do some computing and return a Dictionary.       

    // Method will fall through here if the user is not authenticated.
    HttpContext.Current.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
    return null;
}

Перенаправление не работает, я всегда получаю внутреннюю ошибку сервера 500 при выполнении этого.Я пробовал разные коды.Как бы вы порекомендовали поступить здесь?Мне нужно прочитать информацию о перенаправлении из JavaScript и загрузить новую страницу (или, возможно, отобразить AJAX-способ управления входом).

На самом деле я получаю обратно объект JSON, который выглядит примерно так:

{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"
}

Я попытался запустить отладчик, но он не показывает, что какие-либо методы введены.Как вы можете видеть, трассировка стека равна нулю...

При вызове в Fiddler в качестве стандартного POST-запроса (не XMLHttpRequest) он фактически возвращает исключение:

HTTP/1.1 500 Internal Server Error
Server: ASP.NET Development Server/9.0.0.0
Date: Wed, 04 Mar 2009 14:46:02 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 1739
Connection: Close

System.NotSupportedException: The type System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] is not supported because it implements IDictionary.
   at System.Xml.Serialization.TypeScope.GetDefaultIndexer(Type type, String memberInfo)
   at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference)
   at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
   at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean directReference)
   at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
   at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root)
   at System.Web.Services.Protocols.XmlReturn.GetInitializers(LogicalMethodInfo[] methodInfos)
   at System.Web.Services.Protocols.XmlReturnWriter.GetInitializers(LogicalMethodInfo[] methodInfos)
   at System.Web.Services.Protocols.MimeFormatter.GetInitializers(Type type, LogicalMethodInfo[] methodInfos)
   at System.Web.Services.Protocols.HttpServerType..ctor(Type type)
   at System.Web.Services.Protocols.HttpServerProtocol.Initialize()
   at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
   at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
Это было полезно?

Решение 3

Я вообще избавился от кода статуса и просто возвратил null . Метод возвращает пустой список, если файлов нет, общее количество страниц равно 0. Но если пользователь не прошел проверку подлинности, он возвращает null , в этом случае я использую window.location , чтобы перенаправить браузер на страницу входа.

Другие советы

Не следует перенаправлять из веб-службы. Он должен возвращать значение, чтобы указать, следует ли вам перенаправить или нет ( Это может быть отдельный метод Authenticate , который возвращает string , если он нулевой, это означает, что аутентифицируется, если это не так, он будет содержать URL-адрес перенаправления . Затем в javascript вы можете проверить возвращаемое значение и соответствующим образом перенаправить, установив свойство window.location .

Кстати, доступ к веб-сервису не должен требовать аутентификации.

У меня нет конкретного опыта работы с asp.net, но в целом мне нравится использовать объект ajaxResponse, который имеет такие свойства, как «success», «content» и «errortype». Ответ, требующий входа в систему, в этом случае будет иметь успех " ложь " и errortype " login " или что вы выберете. Затем код javascript решает, как обрабатывать возвращаемый объект, основываясь на этих свойствах, показывая пользователю форму входа или перенаправляя на новую страницу.

Создайте исключение в веб-сервисе. Поймайте это в вызывающем и перенаправьте при необходимости.

Фактически, если ваше сообщение на веб-сервисах (ajax или нет) содержит заголовок "Content-Type" со значением "application / json;charset=utf-8", тогда стек ASMX отправит вам обратно строку в формате json, за исключением предполагаемого перенаправления, которое обычно вы ожидаете, включая код статуса 401 (неавторизованный), но, если вы не отправите заголовок типа контента, вы получите перенаправление браузера на страницу входа в систему в качестве ответа с кодом статуса OK и, используя ajax, вы получите html страницы входа в систему в качестве ответа.

Надеюсь, что это поможет в разъяснении.

С уважением

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top