WCF与客户端上的身份相同?

时间:2012-12-25 14:19:14

标签: c# wcf identity

对于一个试验项目,我正在努力服务。客户端是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。配置可能有问题吗?

2 个答案:

答案 0 :(得分:1)

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

这意味着,如果您已在客户端Windows身份验证上定义,则WCF将找到填充了您使用的Windows身份的用户名的安全上下文。

为了使用Windows帐户对servive进行身份验证,您可以使用以下代码 在客户端:

channelFactory.Credentials.Windows.ClientCredential =
                        new NetworkCredential(username, password, domain);

使用此代码后,您可以使用以下代码访问服务器端的标识:

OperationContext.Current.ServiceSecurityContext.PrimaryIdentity

通常,尝试明确客户端身份验证信息。目前,你似乎 通过设置标识,简单地使用Windows身份验证模式的默认行为 在当前的线程上。

我希望这会有所帮助。

答案 1 :(得分:0)

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

在发送到WCF服务的消息中,我创建了一些属性,其中包含创建GenericPrinicpal所需的datacontracts中的信息(在此用户名和角色中)。因为我有一个受信任的子系统,所以我不想在每个WCF服务上对用户进行身份验证(对于我的方案而言需要很多开销)。 See also Trusted subsystem

有了这个,我创建了一个WCF扩展,它实现了一个参数检查器,并通过反射我在合同的指定属性中设置了CurrentPrincipal的凭据。 For more information about parameter inspectors and how to apply it