13

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

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

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

4

2 回答 2

17

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

首先,您应该尝试理解“声明集的东西”:

然后,您需要知道声明集的来源:

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

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

  1. 客户SecurityToken使用 a创建一个SecurityTokenProvider
  2. 客户端序列化SecurityToken使用SecurityTokenSerializer
  3. 服务器反序列化SecurityToken使用SecurityTokenSerializer
  4. 服务器IAuthorizationPolicy使用 a 创建 sSecurityTokenAuthenticator
  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);

对于X509SecurityTokens 使用X509SecurityTokenProvider/ Authenticator。对于WindowsSecurityTokens 有一个WindowsSecurityTokenAuthenticator但没有一个提供者;相反,使用WindowsSecurityToken构造函数:

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

这工作得很好。到目前为止,我唯一省略的是令牌序列化。有一个SecurityTokenSerializer类在.NET 框架中有一个实现:WSSecurityTokenSerializerWCF 附带的类。

序列化UserNameSecurityTokens 和X509SecurityTokens 就像一个魅力(没有尝试过反序列化),但WindowsSecurityToken序列化程序显然不支持 s 。这给我留下了我已经拥有的两种身份验证方法(证书和用户名/密码),因为AuthorizationContext无论如何我都不想要那样,我会坚持我所拥有的:)

于 2009-03-14T22:14:39.040 回答
7

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

于 2013-02-07T10:01:10.910 回答