我有一个基于 TcpClient/TcpListener 和 SslStream 的简单客户端服务器应用程序。客户端可以使用 X509Certificate 或在建立 SslStream 后发送用户名和密码来向服务器验证自己的身份。

WCF 利用 系统.身份模型 用于身份验证目的的命名空间,但是 显然 可以在任意应用程序中使用——这听起来很有趣。不过,关于如何做到这一点的信息很少(或者我的 Google foo 今天很弱)。

所以,我的问题是: 我需要做什么才能将 System.IdentityModel 与我的应用程序集成? 我不确定我是否需要所有这些 ClaimSet 内容,但如果用户可以仅使用他们的 Windows 帐户或任何其他提供的身份验证机制登录,那就太好了。(不幸的是,我不能只切换到 WCF,而必须使用自定义协议,尽管必要时我可以对其进行一些更改。)

有帮助吗?

解决方案

我的 Google foo 确实很弱。答案就在我问题的链接后面。所以这里有几个链接 这个博客 万一有人最终有同样的问题。

首先,您应该尝试理解“声明集内容”:

然后,您需要知道声明集来自哪里:

有了这些知识,事情实际上变得非常简单。

如果我理解正确的话,基本工作流程将是这样的:

  1. 客户端创建一个 SecurityToken 用一个 SecurityTokenProvider
  2. 客户端序列化 SecurityToken 用一个 SecurityTokenSerializer
  3. 服务器反序列化 SecurityToken 用一个 SecurityTokenSerializer
  4. 服务器创建 IAuthorizationPolicy使用一个 SecurityTokenAuthenticator
  5. 服务器创建 AuthorizationContextIAuthorizationPolicys
  6. 完毕

例子:

// Create the SecurityTokenProvider
var p = new UserNameSecurityTokenProvider("username", "password");

// Get the SecurityToken from the SecurityTokenProvider
var t = p.GetToken(TimeSpan.FromSeconds(1.0)) as UserNameSecurityToken;

// ... transmit SecurityToken to server ...

// Create the SecurityTokenAuthenticator
var a = new CustomUserNameSecurityTokenAuthenticator(
    UserNamePasswordValidator.None);

// Create IAuthorizationPolicies from SecurityToken
var i = a.ValidateToken(t);

// Create AuthorizationContext from IAuthorizationPolicies
var c = AuthorizationContext.CreateDefaultAuthorizationContext(i);
ShowClaims(c.ClaimSets);

为了 X509SecurityToken使用一个 X509SecurityTokenProvider/Authenticator. 。为了 WindowsSecurityToken有一个 WindowsSecurityTokenAuthenticator 但不是提供者;相反,使用 WindowsSecurityToken 构造函数:

var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());

这非常有效。到目前为止,我唯一省略的是令牌序列化。有一个 SecurityTokenSerializer 在 .NET 框架中有一个实现的类:这 WSSecurityTokenSerializer WCF 自带的类。

序列化 UserNameSecurityTokenX509SecurityTokens 的工作方式就像一个魅力(还没有尝试过反序列化),但是 WindowsSecurityToken序列化器显然不支持 s 。这给我留下了我已经拥有的两种身份验证方法(证书和用户名/密码),并且,因为我不希望这样 AuthorizationContext 无论如何,我会坚持我所拥有的:)

其他提示

我没有资格对现有解决方案发表评论,但我想将新 URL 发布到解决方案中列出的博客,因为这些博客不再起作用。如果有人可以将其更改为评论,我将不胜感激。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top