Die Sicherung der WCF-service-Endpunkt mit benutzerdefinierten Authentifizierung
Möchte ich einige sichere Endpunkt einer WCF-service -, ich weiß nicht, ob Sie können einige sichere Endpunkt-und andere nicht. Unten habe ich die stripped WCF-Dienst (selbst gehostet). Das gleiche WCF dient auch der CA-Policy-Datei. Wenn ich Schrauben Sie den WCF-Dienst oder einige Endpunkte ut der CA-Policy müssen Sie nicht mich Fragen, eine Benutzername-Passwort. Die Richtliniendatei muss zugänglich sein, alle Zeit. Ist das auch möglich?
Ich fand eine Menge WCF-benutzerdefinierte blogs/postings. Es gibt eine Menge Möglichkeiten, das zu tun Sicherheit. Alles was ich will ist, dass ich sicher einige Endgeräte mit Benutzername/Passwort, aber die Anmeldeinformationen müssen nicht sichtbar sein, mit tools wie Fiddler. Die Daten kann aber sichtbar sein in diesem Fall.
Implementiert habe ich schon ein Customvalidator-aber die app.config-Datei ist auch wichtig zu definieren, Dinge. Und ich bin nicht sehr gut darin.
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;
}
}
}
App.config. Diese config-Datei funktioniert nicht. Ich wollte die benutzerdefinierte Authentifizierung für einen Endpunkt. Ich habe keine Ahnung.
<?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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher - man muss einfach erstellen zwei separaten binding-Konfigurationen, und verwenden Sie eine auf die Endpunkte, die gesichert sind, sind die anderen auf der anderen:
Marc
PS: nicht sicher, ob das nur ein problem mit deinen postings nicht mehr aktuellen - haben Sie bemerkt, dass Sie zwei separate Verhalten Konfigurationen:
und Ihr service ist nur zu verweisen auf die "mex" Verhalten? Das bedeutet, Ihr service ist in der Tat mit der
<serviceMetadata>
Verhalten - aber NICHT die<serviceCredentials>
eine!Müssen Sie verschmelzen in ein und verweisen Sie dann nur:
Marc
http://192.168.0.199:97/Secured/Test
für den sicheren service und diehttp://192.168.0.199:97/Unsecured/Test
für die nicht gesicherten serviceWenn Sie möchten, schützen Sie die gesamte Nachricht, Transport-security-Modus ist der Weg zu gehen. Wenn du willst, nur dein Header einer verschlüsselten/signierten Nachricht Sicherheits-Modus ermöglicht es diese, aber Sie müssen verwenden Sie wsHttpBinding. Sie können auch erwägen, Verdauen zu schützen Anmeldeinformationen.
Als für dein Beispiel, ich denke, Ihr kommentiert Teil sollte wie folgt Aussehen:
Werde Sie auch aktualisieren Sie Ihre Endpunkt-Deklaration:
Werden Sie nicht verwenden dürfen, mit plain-HTTP-transport-security-Modus.