如何在自己的客户端-服务器应用程序中使用 System.IdentityModel
-
22-07-2019 - |
题
我有一个基于 TcpClient/TcpListener 和 SslStream 的简单客户端服务器应用程序。客户端可以使用 X509Certificate 或在建立 SslStream 后发送用户名和密码来向服务器验证自己的身份。
WCF 利用 系统.身份模型 用于身份验证目的的命名空间,但是 显然 可以在任意应用程序中使用——这听起来很有趣。不过,关于如何做到这一点的信息很少(或者我的 Google foo 今天很弱)。
所以,我的问题是: 我需要做什么才能将 System.IdentityModel 与我的应用程序集成? 我不确定我是否需要所有这些 ClaimSet 内容,但如果用户可以仅使用他们的 Windows 帐户或任何其他提供的身份验证机制登录,那就太好了。(不幸的是,我不能只切换到 WCF,而必须使用自定义协议,尽管必要时我可以对其进行一些更改。)
解决方案
我的 Google foo 确实很弱。答案就在我问题的链接后面。所以这里有几个链接 这个博客 万一有人最终有同样的问题。
首先,您应该尝试理解“声明集内容”:
然后,您需要知道声明集来自哪里:
有了这些知识,事情实际上变得非常简单。
如果我理解正确的话,基本工作流程将是这样的:
- 客户端创建一个
SecurityToken
用一个SecurityTokenProvider
- 客户端序列化
SecurityToken
用一个SecurityTokenSerializer
- 服务器反序列化
SecurityToken
用一个SecurityTokenSerializer
- 服务器创建
IAuthorizationPolicy
使用一个SecurityTokenAuthenticator
- 服务器创建
AuthorizationContext
从IAuthorizationPolicy
s - 完毕
例子:
// 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 自带的类。
序列化 UserNameSecurityToken
沙 X509SecurityToken
s 的工作方式就像一个魅力(还没有尝试过反序列化),但是 WindowsSecurityToken
序列化器显然不支持 s 。这给我留下了我已经拥有的两种身份验证方法(证书和用户名/密码),并且,因为我不希望这样 AuthorizationContext
无论如何,我会坚持我所拥有的:)
其他提示
我没有资格对现有解决方案发表评论,但我想将新 URL 发布到解决方案中列出的博客,因为这些博客不再起作用。如果有人可以将其更改为评论,我将不胜感激。