La sécurisation de la WCF point de terminaison de service avec l'authentification personnalisée
Je tiens à assurer un point de terminaison d'un service WCF, je ne sais pas si vous pouvez obtenir un point de terminaison, et d'autres non. Ci-dessous, j'ai l'dépouillé de service WCF (auto-hébergé). La même WCF sert également le CA de la Politique de fichier. Si je sécuriser ce service WCF ou quelques points de terminaison de ut le CA de la Politique ne doit pas me demander un nom d'utilisateur mot de passe. La politique de fichier doit être accessible tout le temps. Est-ce que ça ira?
J'ai trouvé beaucoup WCF personnalisé blogs/posts. Il ya beaucoup de façons de faire de la sécurité. Tout ce que je veux, c'est que je peux obtenir quelques points de terminaison avec le nom d'utilisateur/mot de passe, mais les informations d'identification ne doit pas être visible avec des outils comme Fiddler. Les données mais il peut être visible dans ce cas.
J'ai mis en place déjà un Customvalidator mais l'app.fichier de configuration est également importent définir les choses. Et je ne suis pas très bon à cela.
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;
}
}
}
L'application.config. Ce fichier de configuration ne fonctionne pas. Je voulais mettre l'authentification personnalisée pour un point de terminaison. Je n'ai aucune idée.
<?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>
OriginalL'auteur Shift | 2009-08-18
Vous devez vous connecter pour publier un commentaire.
Assurez - vous juste besoin de créer deux configurations de liaison, et d'utiliser l'un sur les effets qui sont sécurisés, l'autre sur les autres:
Marc
PS: je ne sais pas si c'est juste un problème avec vos posts ne pas être à la date de la plus - avez-vous remarqué, que vous avez deux configurations de comportement:
et votre service est uniquement en faisant référence à la "mex" comportement? Cela signifie que votre service est en effet à l'aide de la
<serviceMetadata>
comportement - mais PAS la<serviceCredentials>
!Vous avez besoin de fusionner en une seule et puis juste une référence:
Marc
Cette erreur vient de cette config ici: <serviceCredentials> <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WindowsFormsApplication11.CustomValidator, CustomValidator" /> </serviceCredentials>, c'Est que "CustomValidator" assemblée disponibles lorsque vous exécutez votre service??
J'ai changé de WindowsFormsAppiication11. C'est une auto hébergé service WCF sur les windows Forms. Après j'ai changé de ce que j'ai dit que l'erreur a disparu, mais une autre question 🙁 La ChannelDispatcher à '192.168.0.199:87/Test " avec contrat(s)", "IWmsStat"' est pas en mesure d'ouvrir son IChannelListener
+1 pour dang utile marc_s!
Accord - +1 de moi, aussi, pour votre immense patience et la volonté d'aider!
OriginalL'auteur marc_s
Si vous souhaitez protéger l'intégralité du message, de la sécurité du Transport de la mode est un moyen d'aller. Si vous voulez seulement de vos en-têtes pour être chiffré ou signé, le Message mode de sécurité qui permet cela, mais vous aurez à utiliser wsHttpBinding. Vous pouvez également envisager de recourir à Digérer pour protéger les informations d'identification.
Comme pour ton exemple, je pense que votre commentée de la partie devrait ressembler à ceci:
Vous aurez également à mettre à jour votre point de terminaison de la déclaration:
Vous ne serez pas autorisé à utiliser du HTTP avec la sécurité du transport de la mode.
Je ne veux pas utiliser le protocole https, donc j'ai le Message sélectionné le mode de sécurité
déplacer paramètre behaviorconfiguration="CalculatorServiceBehavior"> le numéro de service
Sur l'étiquette de service, il y a le paramètre behaviorconfiguration="mex" effet le reste de mon code si je changer ça?
juste de fusionner ces deux comportements dans l'une et s'y référer
OriginalL'auteur Dmitry Ornatsky