如何在WCF服务中身份验证basicHttpBinding的?
-
21-09-2019 - |
题
我开发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。