2012-09-14 10 views
6

WCF ile nispeten basit bir kendi kendine barındırılan RESTful hizmeti oluşturmaya çalışıyorum, ancak özel kimlik doğrulaması eklemek istedim. Bu amaçla UserNamePasswordValidator'u geçersiz kılmaya çalıştım. Ne yazık ki, bu bir kullanıcı adı/şifre kombinasyonunu doğrulamak için çağrılsa da, kullanıcı adı/şifre geçmezse, sunucu beklediğim gibi 401 Yetkisiz yerine 403 Yasaklandı. Bu, büyük bir soruna neden olacaktır, çünkü bir kullanıcı ilk kez kimlik doğrulaması yapmazsa, tarayıcıyı yeniden başlatmadıkça kimlik bilgilerini tekrar girmeleri istenmez. Peki, ne yapıyorum yanlış? Neden kendi kendime barındırılan WCF hizmetim geri geliyor 403 Yasaksız, 401 Yetkisiz değil mi?

Bu

Bugüne kadar ne var:

Zaten bu other, similar question not aldım

class Program 
{ 
    static void Main(string[] args) 
    { 
     WebServiceHost host = null; 
     try 
     { 
      host = new WebServiceHost(typeof (MyService)); 
      const string uri = "http://127.0.0.1/MyService"; 
      var wb = new WebHttpBinding 
          { 
           Security = 
            { 
             Mode = WebHttpSecurityMode.TransportCredentialOnly, 
             Transport = {ClientCredentialType = HttpClientCredentialType.Basic} 
            } 
          }; 
      var ep = host.AddServiceEndpoint(typeof (IMyService), wb, uri); 
      host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom; 
      host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new PasswordValidator(); 
      host.Open(); 

      Console.WriteLine("Press any key to terminate"); 
      Console.ReadKey(); 
     } 
     finally 
     { 
      if (host != null) host.Close(); 
     } 
    } 
} 

public class PasswordValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string userName, string password) 
    { 
     if (null == userName || null == password) 
      throw new ArgumentNullException(); 

     if (userName == "Test" && password == "Password") return; 
     throw new WebFaultException(HttpStatusCode.Unauthorized); 
    } 
} 

(gerçek ServiceContract bir dize döndürür tek bir yöntem içerir), ancak hiçbiri Orada yayınlanan cevaplar aslında çalışır. Sorunun daha tam olarak tanımlanmış bir versiyonunun daha iyi yanıtlar almasını umuyorum.

+1

Bu yardımcı olabilir http://stackoverflow.com/questions/2198560/self-hosted-wcf-rest-service-and-basic-authentication – Alex

+0

Tam olarak yardımcı olmuyor, ancak ahlaki destek sağlıyor ve açıklama :) – adhocgeek

+0

Aslında, onu geri alıyorum, orada bir çözüm olduğunu, bu soruya gönderilen ve kabul edilenle aynı olduğunu görecek kadar okumamıştım. – adhocgeek

cevap

7

bu deneyin:

public override void Validate(string userName, string password) 
{ 
    if (null == userName || null == password)    
     throw new ArgumentNullException(); 
    if (userName == "Test" || password == "Password") return; 

    WebFaultException rejectEx = new WebFaultException(HttpStatusCode.Unauthorized); 
    rejectEx.Data.Add("HttpStatusCode", rejectEx.StatusCode); 
    throw rejectEx; 
} 

Bildiğim kadarıyla bu WCF yığın içten istisnalar yönetir nasıl güvenir bir belgesiz tekniktir bildiği gibi. Belgelenmiş bir yol olmalı ama ben bir tane bulamadım.

+0

Bunu nereden buldunuz? :) Çalışıyor, ama şimdi WCF'yi kullanmak isteyip istemediğimi düşünüyorum ... – adhocgeek

+0

Reflector kullanarak WCF koduna baktım. –

İlgili konular