2009-11-24 107 views
4

我开发WCF服务,basicHttpBinding的,这些服务应该使用.NET 1.1 & .NET 2.0,为此,我使用basicHttpBinding的访问。
在旧的ASMX Web服务中,我找到了一个Soap Header(AuthHeader)来验证用户的每个请求。

如何在WCF中使用basicHttpBinding进行身份验证?任何示例或教程都会有帮助。如何在BasicHttpBinding中的WCF服务中进行身份验证?


NRK

回答

7

您可以像切换到WCF之前一样使用AuthHeader。也许它会更方便你,因为原则将保持不变。 我在这个解决方案中看到的坏事是纯文本密码传输。无论如何,这只是另一种选择,你可以以某种方式加密/解密密码。

在这种情况下,你应该实现自己的IDispatchMessageInspector & IClientMessageInspector,像

[AttributeUsage(AttributeTargets.Class)] 
public class CredentialsExtractorBehaviorAttribute : Attribute, IContractBehavior, IDispatchMessageInspector 
{ 
    #region IContractBehavior implementation. 

    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, 
             DispatchRuntime dispatchRuntime) 
    { 
     dispatchRuntime.MessageInspectors.Add(this); 
    } 

    ... empty interface methods impl skipped ... 

    #endregion 

    #region IDispatchMessageInspector implementation. 

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     int i = request.Headers.FindHeader("username", "sec"); 
     if (-1 != i) 
     { 
      string username = request.Headers.GetHeader<string>("username", "sec"); 
      ... do smth ... 
     } 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     return; 
    } 

    #endregion 
} 

在一个样品,我把到头了用户名,但你可以实现你的包含用户名和密码类,并使用它来代替字符串。 在客户端:

internal class CredentialsInserter : IContractBehavior, IClientMessageInspector 
{ 
    private string m_username; 

    public CredentialsInserter(string username) 
    { 
     m_username = username; 
    } 

    #region IContractBehavior implementation. 

    ... empty interface methods impl skipped ... 

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, 
            ClientRuntime clientRuntime) 
    { 
     clientRuntime.MessageInspectors.Add(this); 
    } 

    #endregion 

    #region IClientMessageInspector implementation. 

    public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     MessageHeader<string> mh = new MessageHeader<string>(m_username); 
     request.Headers.Add(mh.GetUntypedHeader("username", "sec")); 
     return null; 
    } 

    public void AfterReceiveReply(ref Message reply, object correlationState) 
    { 
     return; 
    } 

    #endregion 
} 

那么你应该把属性CredentialsExtractorBehaviorAttribute您的服务实现类。

[CredentialsExtractorBehavior] 
public class DummyService : IDummyService 
{ 
    ... impl ... 
} 

而在客户端,你应该做到以下几点:

 using (DummyServiceClient c = new DummyServiceClient("TcpEndpoint")) 
     { 
      c.ChannelFactory.Endpoint.Contract.Behaviors.Add(
       new CredentialsInserter("_username_")); 
      c.DummyMethod(); 
     } 
3

首先 - 是的,你可以!这取决于您是使用传输还是消息绑定 - 如果您是面向互联网的用户,则更有可能使用基于消息的安全性。

不幸的是,对于基于消息的安全性,basicHttpBinding只支持有点痛苦的证书。

wsHttpBinding另一方面也支持用户名/密码或其他方法。

你会喜欢这个配置使用用户名/密码,客户证书的wsHttpBinding过基于消息的安全:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="wsUserName"> 
      <security mode="Message"> 
      <message clientCredentialType="UserName"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service name="yourservice"> 
     <endpoint name="YourEndpoint" 
        address="" 
        binding="wsHttpBinding" 
        bindingConfiguration="wsUserName" 
        contract="IYourService" /> 
     </service> 
    </services> 
    </system.serviceModel> 

<bindings>下的部分定义绑定配置对于使用消息的安全与用户名的wsHttpBinding /密码客户端凭证。

<service>下的部分定义了一个示例服务,它使用wsHttpBinding并引用我们刚定义的绑定配置。

在服务器端,您现在可以使用通过电话线发送的用户名/密码来验证您的呼叫者在Active Directory中(每个人呼叫需要一个AD帐户)还是在ASP.NET成员资格中系统数据库;或者如果你确实需要,你也可以编写自己的认证机制。

寻找WCF security at Codeplex - 优秀资源的很多有用信息。

+0

谢谢,marc_s,我将通过这个名为CodePlex的材料。所以,我只能对basicHttpBiding中的证书进行验证。这意味着我无法验证用户对用户名和密码?在basichttpBiding中有没有其他的用户名和密码进行验证/验证? --nrk – nRk 2009-11-24 06:36:43

+0

@nrk:是的,如果您在basicHttpBinding中使用消息安全性,则只能使用证书进行身份验证。如果您使用传输安全性,那么您可以使用其他认证方式 – 2009-11-24 11:04:49

0

检查场景here以尝试将其与您的情况相匹配。每个场景都提供了实施该解决方案所需项目的chceklist。

相关问题