2009-08-18 19 views
7

Chcę zabezpieczyć punkt końcowy usługi WCF, nie wiem, czy można zabezpieczyć niektóre punkty końcowe, a niektóre nie. Poniżej mam usuniętą usługę WCF (hostowane samodzielnie). Ta sama funkcja WCF obsługuje również plik zasad urzędu certyfikacji. Jeśli zabezpieczysz tę usługę WCF lub niektóre punkty końcowe ut, część CA Policy nie może zadać mi hasła do nazwy użytkownika. Plik zasad musi być dostępny przez cały czas. Czy to też jest możliwe?Zabezpieczanie punktu końcowego usługi WCF za pomocą niestandardowego uwierzytelniania

Znalazłem wiele niestandardowych blogów/postów WCF. Istnieje wiele sposobów na zapewnienie bezpieczeństwa. Wszystko, czego chcę, to to, że mogę zabezpieczyć niektóre punkty końcowe nazwą użytkownika/hasłem, ale poświadczenia nie mogą być widoczne przy użyciu narzędzi takich jak Fiddler. Dane jednak mogą być widoczne w tym przypadku.

Zaimplementowałem już Customvalidator, ale plik app.config jest również importerem, aby zdefiniować rzeczy. I nie jestem w tym dobry.

namespace WindowsFormsApplication11 
{ 
    public partial class Form1 : Form 
    { 
     public ServiceHost _host = null; 

     public Form1() 
     { 
      InitializeComponent(); 
     }  

     private void button1_Click(object sender, EventArgs e) 
     { 
      // Create a ServiceHost for the CalculatorService type and 
      // provide the base address. 
      _host = new ServiceHost(typeof(WmsStatService)); 
      _host.AddServiceEndpoint(typeof(IPolicyProvider), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior()); 

      _host.Open(); 
     } 
    } 

    // Define a service contract. 
    [ServiceContract(Namespace = "http://WindowsFormsApplication11")] 
    public interface IWmsStat 
    { 
     [OperationContract] 
     string getConnectedViewers(string channelName); 
     [OperationContract] 
     string sayHello(string name); 
    } 

    [ServiceContract] 
    public interface IPolicyProvider 
    { 
     [OperationContract, WebGet(UriTemplate = "/ClientAccessPolicy.xml")] 
     Stream ProvidePolicy(); 
    } 
    //[DataContract] 
    public class Ads 
    { 
     // [DataMember] 
     public string AdFileName { get; set; } 
     //[DataMember] 
     public string AdDestenationUrl { get; set; } 
     public string ConnectedUserIP { get; set; } 
    } 
    // 
    public class CustomValidator : UserNamePasswordValidator 
    { 
     public override void Validate(string userName, string password) 
     { 
      if(null == userName || null == password) 
      { 
        throw new ArgumentNullException(); 
      } 
      if(userName == "Oguz" && password == "2009") 
      { 
       return; 
      } 
      FaultCode fc = new FaultCode("ValidationFailed"); 
      FaultReason fr = new FaultReason("Good reason"); 
      throw new FaultException(fr,fc); 
     } 
    } 
    // 

    public class WmsStatService : IWmsStat, IPolicyProvider 
    { 
     public string sayHello(string name) 
     { 
      return "hello there " + name + " nice to meet you!"; 
     } 

     public Stream ProvidePolicy() 
     { 
      WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml"; 
      return new MemoryStream(File.ReadAllBytes("ClientAccessPolicy.xml"), false); 
     } 

     public string getConnectedViewers(string channelname) 
     { 
      // do stuff 
      return null; 
     } 
    } 
} 

Aplikacja.config. Ten plik konfiguracyjny nie działa. Chciałem umieścić niestandardowe uwierzytelnienie dla punktu końcowego. Nie mam pojęcia.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="WindowsFormsApplication11.WmsStatService" behaviorConfiguration="mex"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://192.168.0.199:87" /> 
      </baseAddresses> 
     </host>   
     <endpoint address="http://192.168.0.199:87/Test" binding="basicHttpBinding" bindingConfiguration="" contract="WindowsFormsApplication11.IWmsStat" behaviorConfiguration="MyServiceBehavior" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 

    <!--<bindings> 
     <wsHttpBinding>  
     <binding name="wshttp"> 
      <security mode="Message"> 
      <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings>--> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="mex"> 
      <serviceMetadata httpGetEnabled="true" httpGetUrl=""/> 
     </behavior> 
     <behavior name="MyServiceBehavior"> 
      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WindowsFormsApplication11.CustomValidator, CustomValidator" /> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors>  
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Odpowiedz

17

Chcę zabezpieczyć jakiś punkt końcowy usługi WCF, nie wiem, czy można zabezpieczyć jakiś punkt końcowy, a niektóre nie.

Oczywiście - wystarczy utworzyć dwa osobne konfiguracje wiążących i użyć po jednym z tych punktów końcowych, które są zabezpieczone, a drugi na innych:

<bindings> 
    <basicHttpBinding> 
    <binding name="secured"> 
     <security mode="Message"> 
     <message ...... /> 
     </security> 
    </binding> 
    <binding name="unsecured"> 
     <security mode="None" /> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<services> 
    <service name="WindowsFormsApplication11.WmsStatService" behaviorConfiguration="mex"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://192.168.0.199:87" /> 
     </baseAddresses> 
    </host>   

    <endpoint address="/Secured/Test" 
       binding="basicHttpBinding" bindingConfiguration="secured" 
       contract="WindowsFormsApplication11.IWmsStat" 
       behaviorConfiguration="MyServiceBehavior" /> 

    <endpoint address="/Unsecured/Test" 
       binding="basicHttpBinding" bindingConfiguration="unsecured" 
       contract="WindowsFormsApplication11.IWmsStat" 
       behaviorConfiguration="MyServiceBehavior" /> 

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 

Marca

PS: Nie wiem Jeśli to tylko problem z tym, że twoje posty nie są już aktualne - czy zauważyłeś, że masz dwie osobne konfiguracje zachowania:

<behaviors> 
    <serviceBehaviors> 
     <behavior name="mex"> 
     <serviceMetadata httpGetEnabled="true" httpGetUrl=""/> 
     </behavior> 
     <behavior name="MyServiceBehavior"> 
     <serviceCredentials> 
      <userNameAuthentication 
       userNamePasswordValidationMode="Custom" 
       customUserNamePasswordValidatorType="WindowsFormsApplication11.CustomValidator, CustomValidator" /> 
     </serviceCredentials> 
     </behavior> 
    </serviceBehaviors>  
</behaviors> 

, a Twoja usługa odwołuje się tylko do zachowania "mex"? Oznacza to, że Twoja usługa rzeczywiście korzysta z zachowania <serviceMetadata> - ale jest to jedna z nich!

Musisz połączyć je w jedno, a następnie odwołać się tylko, że:

<behaviors> 
    <serviceBehaviors> 
     <behavior name="Default"> 
     <serviceMetadata httpGetEnabled="true" httpGetUrl=""/> 
     <serviceCredentials> 
      <userNameAuthentication 
       userNamePasswordValidationMode="Custom" 
       customUserNamePasswordValidatorType="WindowsFormsApplication11.CustomValidator, CustomValidator" /> 
     </serviceCredentials> 
     </behavior> 
    </serviceBehaviors>  
</behaviors> 
<services> 
    <service name="...." behaviorConfiguration="Default" 

Marca

+0

Cholera jestem coraz to teraz :( Nie można załadować pliku lub zestawu „CustomValidator” lub jeden z jego zależnościami System nie może odnaleźć określonego pliku – Shift

+0

Błąd ten wynika z tego config tutaj: jest, że "CustomValidator" zespół dostępny po uruchomieniu usługi ?? –

+0

Zmieniłem że do WindowsFormsAppiication11. to jest samodzielnym gospodarzem WCF usługa na Windows Forms Po tym, jak zmieniłem to na to, co powiedziałem, błąd zniknął, ale kolejny numer :( Program ChannelDispatcher pod adresem "http://192.168.0.199:87/Test" z umowami "" IWmsStat "nie może otworzyć swojego IChannelListener – Shift

2

Jeśli chcesz zabezpieczyć całą wiadomość, tryb transportu Transport jest dobrym sposobem. Jeśli chcesz, aby tylko nagłówki były zaszyfrowane/podpisane, umożliwia to tryb zabezpieczeń wiadomości, ale musisz użyć funkcji wsHttpBinding. Możesz również rozważyć użycie Digest do ochrony danych logowania.

Jak dla przykładu, myślę, że skomentował część powinna wyglądać następująco:

<bindings> 
    <basicHttpBinding> 
      <binding name="secure"> 
     <security mode="Transport"> 
     <transport clientCredentialType="Basic" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Będziesz mieć również zaktualizować deklarację punkt końcowy:

<endpoint 
    address="https://192.168.0.199:87/Test" 
    binding="basicHttpBinding" bindingConfiguration="secure" 
    contract="WindowsFormsApplication11.IWmsStat" /> 

nie będą mogły używać zwykłego HTTP z trybem bezpieczeństwa transportu.

+0

Przy tej konfiguracji otrzymuję następujący błąd. Brak zachowania punktu końcowego o nazwie "MyServiceBehavior" – Shift

+0

Nie chcę używać protokołu https, więc wybrałem Tryb zabezpieczeń wiadomości – Shift

+0

move behaviorConfiguration = "CalculatorServiceBehavior"> do tagu usługi –

Powiązane problemy