我的 Google foo 确实很弱。答案就在我问题的链接后面。所以这里有几个链接到这个博客,以防有人最终有同样的问题。
首先,您应该尝试理解“声明集的东西”:
然后,您需要知道声明集的来源:
有了这些知识,它实际上变得非常简单。
如果我理解正确,基本工作流程将是这样的:
- 客户
SecurityToken
使用 a创建一个SecurityTokenProvider
- 客户端序列化
SecurityToken
使用SecurityTokenSerializer
- 服务器反序列化
SecurityToken
使用SecurityTokenSerializer
- 服务器
IAuthorizationPolicy
使用 a 创建 sSecurityTokenAuthenticator
- 服务器
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
s 使用X509SecurityTokenProvider
/ Authenticator
。对于WindowsSecurityToken
s 有一个WindowsSecurityTokenAuthenticator
但没有一个提供者;相反,使用WindowsSecurityToken
构造函数:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
这工作得很好。到目前为止,我唯一省略的是令牌序列化。有一个SecurityTokenSerializer
类在.NET 框架中有一个实现:WSSecurityTokenSerializer
WCF 附带的类。
序列化UserNameSecurityToken
s 和X509SecurityToken
s 就像一个魅力(没有尝试过反序列化),但WindowsSecurityToken
序列化程序显然不支持 s 。这给我留下了我已经拥有的两种身份验证方法(证书和用户名/密码),因为AuthorizationContext
无论如何我都不想要那样,我会坚持我所拥有的:)