0

对于一个试验项目,我正在为一项服务而苦苦挣扎。客户端是 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。也许配置有问题?

4

2 回答 2

1

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

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

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

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

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

OperationContext.Current.ServiceSecurityContext.PrimaryIdentity

一般来说,尽量明确客户端身份验证信息。目前,您似乎只是通过在当前线程上设置身份来简单地使用 Windows 身份验证模式的默认行为。

我希望这有帮助。

于 2012-12-25T17:31:42.727 回答
0

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

在发送到 WCF 服务的消息中,我创建了一些属性,其中包含创建 GenericPrinicpal 所需的数据合同中的信息(在此用户名和角色)。因为我有一个受信任的子系统,所以我不想在每个 WCF 服务上对用户进行身份验证(对我的场景来说开销很大)。另请参阅可信子系统

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

于 2013-01-06T14:28:56.090 回答