如何在BasicHttpBinding中的WCF服务中进行身份验证?
我开发WCF服务,basicHttpBinding的,这些服务应该使用.NET 1.1 & .NET 2.0,为此,我使用basicHttpBinding的访问。
在旧的ASMX Web服务中,我找到了一个Soap Header(AuthHeader)来验证用户的每个请求。
如何在WCF中使用basicHttpBinding进行身份验证?任何示例或教程都会有帮助。如何在BasicHttpBinding中的WCF服务中进行身份验证?
NRK
您可以像切换到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();
}
首先 - 是的,你可以!这取决于您是使用传输还是消息绑定 - 如果您是面向互联网的用户,则更有可能使用基于消息的安全性。
不幸的是,对于基于消息的安全性,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 - 优秀资源的很多有用信息。
谢谢,marc_s,我将通过这个名为CodePlex的材料。所以,我只能对basicHttpBiding中的证书进行验证。这意味着我无法验证用户对用户名和密码?在basichttpBiding中有没有其他的用户名和密码进行验证/验证? --nrk – nRk 2009-11-24 06:36:43
@nrk:是的,如果您在basicHttpBinding中使用消息安全性,则只能使用证书进行身份验证。如果您使用传输安全性,那么您可以使用其他认证方式 – 2009-11-24 11:04:49