WCF与客户端相同的标识

本文关键字:标识 客户端 WCF | 更新日期: 2023-09-27 17:49:25

对于一个实验项目,我正在努力使用一个服务。客户端是ASP。NET MVC 4,该服务将使用WCF构建。现在所有的系统都在一个受信任的子系统中,所以SSL/证书不是必须的。

我目前正在处理的问题是:当我创建一个新的GenericIdentity时,是否有可能:

IIdentity newIdentity = new GenericIdentity("Test", "Custom authentication");
string[] newRoles = { "TestRole" };
IPrincipal testPrincipal = new GenericPrincipal(newIdentity, newRoles);
Thread.CurrentPrincipal = testPrincipal;

当我在WCF服务上调用以下代码时,可以创建用户:

ServiceSecurityContext.Current.WindowsIdentity;

ServiceSecurityContext.Current.PrimaryIdentity;

Thread.CurrentPrinicpal;

我得到了我在客户端创建的用户?或者我必须为此编写一个WCF可扩展性吗?

我目前正在使用WsHttpBinding和安全模式Transport和clientCredentialType: Windows。也许是配置有问题?

WCF与客户端相同的标识

在服务器端(WCF),安全上下文将具有用于对服务进行身份验证的用户名值。

这意味着,如果您在客户端定义了windows身份验证,WCF将发现安全上下文中填充了您使用的windows标识的用户名。

为了让您使用windows帐户对服务进行身份验证,您可以使用以下代码在客户端:
channelFactory.Credentials.Windows.ClientCredential =
                        new NetworkCredential(username, password, domain);
使用此代码后,您可以使用以下代码在服务器端访问标识:
OperationContext.Current.ServiceSecurityContext.PrimaryIdentity

一般来说,尽量显式地显示客户端身份验证信息。目前,你似乎是通过设置标识,简单地使用Windows身份验证模式的默认行为

我发现要在WCF中自动实现这一点,您必须指定证书…

在发送到WCF服务的消息中,我使用数据契约中的信息创建了一些属性,这些信息是创建genericprincipal(在这里是角色中的用户名)所必需的。因为我有一个受信任的子系统,所以我不想对每个wcf服务上的用户进行身份验证(对于我的场景来说开销太大)。另请参见可信子系统

有了这个,我创建了一个WCF扩展,实现了一个参数检查器,并通过反射,我在合同的指定属性中设置了来自CurrentPrincipal的凭据。有关参数检查器以及如何应用它的更多信息