2013-06-07 17 views
6

Oturum belirteci göndererek özel bir kimlik doğrulama mekanizması kullanıyorum. Jetonun varlığı, geçerli anaparayı belirleyen bir DelegatingHandler'da kontrol edilir. Eğer müdür ApiController yöntemini arama yetkisine sahip değilse, denetleyici 401 Yetkisizlik durumu gönderir. RFC 2616'nın her zaman bir 401 yanıtı gönderirken WWW-Authenticate üstbilgisini ayarlamasını gerektirdiği için, benim DelegatingHandler'ım bununla ilgilenir.WWW-Yetkilendirme yanıtı üstbilgisini bir DelegatingHandler içinde ayarlama w2k3 üzerinde neden olur

Web API'sine sahip bir senaryoda, Windows 7'de doğru olarak 401 işiyle yanıt vermesi gereken bir istek vardı, ancak Windows Server 2003'te "Varolan bir bağlantı uzak ana bilgisayar tarafından zorla kapatıldı" özel durumuyla öldürülüyor . Dahası, HttpClient'in bir şekilde 401 yanıtı aldıktan sonra talebi tekrar denemesi gibi, kontrolör yöntemindeki bir kesme noktasının W2k3'te iki kez vurulduğunu fark ettim.

Satırı WWW-Authenticate üstbilgisiyle kaldırdığımda, program düzgün çalışıyor. Bir konsol uygulamasında minimalist bir çoğaltma örneği için lütfen aşağıdaki kod örneklerine bakın.

TestController.cs:

public class TestController : ApiController 
{ 
    public HttpResponseMessage Get() 
    { 
     return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "go away"); 
    } 
} 

AuthenticationHandler.cs:

public class AuthenticationHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(task => 
     { 
      HttpResponseMessage response = task.Result; 
      if (response.StatusCode == HttpStatusCode.Unauthorized && 
       !response.Headers.Contains("WWW-Authenticate")) 
      { 
       // comment out this line and the code works 
       response.Headers.Add("WWW-Authenticate", "SessionToken"); 
      } 
      return response; 
     }); 
    } 
} 

program.cs:

static void Main(string[] args) 
    { 
     HttpSelfHostConfiguration config = new HttpSelfHostConfiguration("http://localhost:81"); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}" 
     ); 
     config.MessageHandlers.Add(new AuthenticationHandler()); 

     using (HttpSelfHostServer server = new HttpSelfHostServer(config)) 
     using (HttpClient client = new HttpClient()) 
     { 
      server.OpenAsync().Wait(); 

      try 
      { 
       HttpResponseMessage response = client.GetAsync("http://localhost:81/api/test").Result; 
       Console.Out.WriteLine(response.StatusCode); 
      } 
      catch (AggregateException ex) 
      { 
       Console.Out.WriteLine(ex.ToString()); 
      } 

      server.CloseAsync().Wait(); 
     } 

     Console.In.ReadLine(); 
    } 

API'yi doğru şekilde mi arıyorum? Herhangi bir fikir yanlış olabilir?

cevap

3

. Net Framework 4.0.3'ü yüklemeniz gerekir. .net framework'ün önceki sürümleri, www kimlik doğrulaması üstbilgisini ayarlayamadı. Get here, konuyla ilgili daha fazla bilgi KB2600211 olduğunu.

İlgili konular