تأمين نقطة نهاية خدمة WCF من خلال مصادقة مخصصة

StackOverflow https://stackoverflow.com/questions/1295385

  •  18-09-2019
  •  | 
  •  

سؤال

أريد تأمين بعض نقاط النهاية لخدمة WCF، ولا أعرف ما إذا كان بإمكانك تأمين بعض نقاط النهاية والبعض الآخر لا.أدناه لدي خدمة WCF المجردة (المستضافة ذاتيًا).يخدم نفس WCF أيضًا ملف سياسة CA.إذا قمت بتأمين خدمة WCF هذه أو بعض نقاط النهاية الخاصة بها، فيجب ألا يطلب مني جزء سياسة CA كلمة مرور اسم المستخدم.يجب أن يكون ملف السياسة قابلاً للوصول طوال الوقت.هل هذا ممكن أيضا؟

لقد وجدت الكثير من المدونات/المنشورات المخصصة لـ WCF.هناك الكثير من الطرق للقيام بالأمن.كل ما أريده هو أن أتمكن من تأمين بعض نقاط النهاية باستخدام اسم المستخدم/كلمة المرور ولكن يجب ألا تكون بيانات الاعتماد مرئية باستخدام أدوات مثل Fiddler.البيانات ومع ذلك يمكن أن تكون مرئية في هذه الحالة.

لقد قمت بالفعل بتطبيق Customvalidator ولكن ملف app.config مهم أيضًا لتحديد الأشياء.وأنا لست جيدًا في ذلك.

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.ملف التكوين هذا لا يعمل.كنت أرغب في وضع المصادقة المخصصة لنقطة النهاية.ليس لدي أي فكرة.

<?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>
هل كانت مفيدة؟

المحلول

أريد تأمين بعض نقطة النهاية لخدمة WCF ، لا أعرف ما إذا كان يمكنك تأمين بعض نقطة النهاية والبعض الآخر.

بالتأكيد - تحتاج فقط إلى إنشاء تكوينين منفصلين للربط، واستخدام أحدهما على نقاط النهاية المؤمنة، والآخر على النقاط الأخرى:

<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>

مارك

ملاحظة:لست متأكدًا مما إذا كانت هذه مجرد مشكلة في عدم تحديث منشوراتك بعد الآن - هل لاحظت أن لديك تكوينين منفصلين للسلوك:

<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>

وخدمتك تشير فقط إلى سلوك "mex"؟وهذا يعني أن خدمتك تستخدم بالفعل <serviceMetadata> السلوك - ولكن لا ال <serviceCredentials> واحد!

تحتاج إلى دمجها في واحد ثم الرجوع إلى ما يلي:

<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" 

مارك

نصائح أخرى

إذا كنت ترغب في حماية الرسالة بأكملها، فإن وضع أمن النقل هو وسيلة للذهاب. إذا كنت ترغب في أن يتم تشفير / توقيع رؤوسك فقط، فإن وضع أمان الرسائل يسمح بذلك، ولكن عليك استخدام WshttpBielding. قد تفكر أيضا في استخدام Digest لحماية بيانات الاعتماد.

بالنسبة إلى مثالك، أعتقد أن الجزء الخاص بك يجب أن يبدو مثل هذا:

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

سيكون عليك أيضا تحديث إعلان نقطة النهاية الخاصة بك:

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

لن يسمح لك باستخدام وضع HTTP سهل مع وضع أمان النقل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top