gpt4 book ai didi

c# - 如何在自己的客户端-服务器应用程序中使用 System.IdentityModel

转载 作者:可可西里 更新时间:2023-11-01 08:05:00 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

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

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

例子:

// 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());

这很好用。到目前为止我唯一省略的是 token 序列化。有一个 SecurityTokenSerializer 类,它在 .NET 框架中有一个实现:WCF 附带的 WSSecurityTokenSerializer 类。

序列化 UserNameSecurityTokenX509SecurityToken 很有魅力(还没有尝试过反序列化),但是 WindowsSecurityToken 显然不受支持序列化器。这给我留下了我已经拥有的两种身份验证方法(证书和用户名/密码),并且由于我不想要 AuthorizationContext 无论如何,我会坚持我拥有的:)

关于c# - 如何在自己的客户端-服务器应用程序中使用 System.IdentityModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/646395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com