我正在使用 basicHttpBinding 开发WCF服务,这些服务应该可以使用.net 1.1& .net 2.0,为此我使用 basicHttpBinding 。
在旧的ASMX Web服务中,我选择了一个Soap Header(AuthHeader)来对每个请求的用户进行身份验证。
如何使用 basicHttpBinding 在WCF中进行身份验证任何样本或教程都会有所帮助。
NRK
答案 0 :(得分:7)
您可以像切换到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
}
在一个示例中,我只放置了标题用户名,但您可以实现一个包含用户名和密码的类,并使用它而不是字符串。 在客户端:
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();
}
答案 1 :(得分:3)
首先 - 是的,你可以!这取决于您是使用传输还是邮件绑定 - 如果您面向Internet,则更有可能使用基于邮件的安全性。
不幸的是,对于基于消息的安全性,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的绑定配置,它使用带有用户名/密码客户端凭据的message-security。
<service>
下的部分定义了一个使用wsHttpBinding并引用我们刚刚定义的绑定配置的示例服务。
在服务器端,您现在可以使用通过网络发送的用户名/密码来验证Active Directory中的呼叫者(每个人都需要与您一起调用AD帐户),或者在ASP.NET成员资格系统中数据库;或者,如果你真的必须,你也可以编写自己的认证机制。
在WCF security at Codeplex上找到很多有用的信息 - 优秀的资源。
答案 2 :(得分:0)
检查方案here,尝试将其与您的情况相匹配。每个方案都提供了实施解决方案所需的项目清单。