gpt4 book ai didi

wcf - 如何在 BasicHttpBinding 的 WCF 服务中进行身份验证?

转载 作者:行者123 更新时间:2023-12-04 22:52:52 25 4
gpt4 key购买 nike

我正在使用 开发 WCF 服务basicHttpBinding ,这些服务应该可以使用 .net 1.1 和 .net 2.0 访问,为此我使用 basicHttpBinding .在旧的 ASMX Web 服务中,我使用一个 Soap Header (AuthHeader) 来验证每个请求的用户身份。 如何使用 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();
}

关于wcf - 如何在 BasicHttpBinding 的 WCF 服务中进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1787740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com