我开发WCF服务是 basicHttpBinding的后,这些服务应该使用.NET 1.1和.NET 2.0是可访问的,为此,我使用的 basicHttpBinding的。结果在旧ASMX Web服务我称职的一个SOAP头(AuthHeader)到每个请求验证用户。搜索结果的在WCF我可以如何进行身份验证使用的 basicHttpBinding的的?任何样本或教程将有益的。

,点击 NRK

有帮助吗?

解决方案

您可以根据您切换到WCF以前那样使用AuthHeader。也许这将是您更方便易,原因princples将保持不变。 坏的事情,我在此解决方案看到的是明文密码传输。无论如何,这只是另一种选择,你可以加密/解密的密码,弄好了。

在这种情况下,你应该实现自己的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
}

在一个样品I放置到标题唯一的用户名,但是可以实施你的含类的用户名和密码,并用它来代替串。 上的客户端:

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();
        }

其他提示

首先 - 是的,你可以!这取决于你是否使用传输或消息绑定 - 如果你是,你是更愿意使用基于消息的安全面临的互联网

不幸的是,基于消息的安全性,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成员资格系统数据库;或者,如果你真的真的必须,您可以编写自己的身份验证机制了。

查找在Codeplex上上WCF 安全 - 优异的资源

检查场景这里试图匹配一个到您的情况。每个场景设置有实施该解决方案所需物品的chceklist。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top