Запретить FormsAuthentication переопределять статус ответа в WCF REST

#asp.net #http #forms-authentication #wcf-rest

#asp.net #http #формы-аутентификация #wcf-rest

Вопрос:

Я использую WCF REST с FormsAuthentication. Этот режим аутентификации переопределяет HTTP 401 Unauthorized статус ответа с помощью a HTTP 302 Found , который перенаправляет на «URL-адрес входа», как в веб-приложении.

Конечно, это не имеет смысла в приложении WCF REST, и я хотел бы убедиться, что статус 401 поступает к запрашивающему.

Я пытался сделать это:

         var response = WebOperationContext.Current.OutgoingResponse;
        response.StatusCode = HttpStatusCode.Unauthorized;
        HttpContext.Current.Response.SuppressContent = true;
        HttpContext.Current.Response.StatusCode = 401;
        HttpContext.Current.Response.End();
  

Но когда эти строки выполняются, я получаю исключение в моем вызове на стороне клиента:

 System.Net.WebException occurred
  Message=The underlying connection was closed: An unexpected error occurred on a receive.
  Source=System
  StackTrace:
       at System.Net.HttpWebRequest.GetResponse()
       at RestPrototype.Web.Infrastructure.Http.ByPassGet(HttpContextBase httpContext, Uri url) in D:TFS SourcePROTOTYPERestPrototype.WebInfrastructureHttp.cs:line 165
  InnerException: System.IO.IOException
       Message=Unable to read data from the transport connection: The connection was closed.
       Source=System
       StackTrace:
            at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)
            at System.Net.HttpWebRequest.MakeMemoryStream(Stream stream)
       InnerException: 
  

На скрипаче я вижу, что отправлен 401:

 HTTP/1.1 401 Unauthorized
Cache-Control: private
Transfer-Encoding: chunked
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 03 Oct 2011 15:22:41 GMT
  

Эта Transfer-Encoding: chunked и другая стороны, закрывающие соединение без отправки тела, вызывают это исключение на стороне клиента. К сожалению, я не знаю, как избежать этого заголовка и поместить a Content-Length: 0 , поскольку ASP.NET переопределяет его.

Я хотел бы решить эту проблему в стиле WCF, без использования пользовательского HttpModule, если это возможно. И если кто-нибудь знает способ предотвратить ASP.NET переопределение моих заголовков будет очень приветствоваться.

С уважением.

Ответ №1:

Вы должны указать через свой web.config, что текущий пользователь не требуется для доступа к определенному маршруту / url. Используйте тег «location»:

 ...
</system.web>
<location path="/MyWCFEndpoint">
    <system.web>
        <authorization>
            <!-- override default authentication settings -->
            <allow users="*"/>
        </authorization>
    </system.web>
</location>
  

Комментарии:

1. К сожалению, это ничего не меняет, происходит то же самое упомянутое поведение.

2. Единственное, что я могу порекомендовать, это попробовать атрибут «path» без косой черты и убедиться, что ваш тег location находится сразу после вашей основной системы. веб-раздел