如何使用 C# 从安全令牌获取信息

2024-01-30

我需要让我的应用程序的用户能够使用他们的个人 USB 安全令牌签署批准。

我已成功签署数据,但无法获取谁的令牌已用于执行此操作的信息。

这是我到目前为止的代码:

CspParameters csp = new CspParameters(1, "SafeNet RSA CSP");
csp.Flags = CspProviderFlags.UseDefaultKeyContainer;            
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
// Create some data to sign. 
byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
Console.WriteLine("Data         : " + BitConverter.ToString(data));
// Sign the data using the Smart Card CryptoGraphic Provider.            
byte[] sig = rsa.SignData(data, "SHA1");            
Console.WriteLine("Signature    : " + BitConverter.ToString(sig));

令牌信息中有一个字段称为“令牌名称”。我如何访问该字段以验证哪个令牌已用于签署批准?

附加信息和更新:

  • “令牌名称”始终与所有者的名称匹配(拥有 USB 的用户) 令牌)
  • 好像做不到,也许有网络服务或者 我需要打电话才能直接获取信息 来自认证机构。

当我最初问这个问题时,我对数字证书的理解非常基础,所以这个问题没有被正确地提出。现在我明白了,我需要从智能卡设备访问证书、查询其属性并测试用户是否可以为其输入正确的 PIN。

这是我用来执行此操作的代码:

//Prompt the user with the list of certificates on the local store.
//The user have to select the certificate he wants to use for signing.
//Note: All certificates form the USB device are automatically copied to the local store as soon the device is plugged in.
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509CertificateCollection certificates = X509Certificate2UI.SelectFromCollection(store.Certificates,
                                                                                "Certificados conocidos",
                                                                                "Por favor seleccione el certificado con el cual desea firmar",
                                                                                X509SelectionFlag.SingleSelection
                                                                                );
store.Close();
X509Certificate2 certificate = null;
if (certificates.Count != 0)
{
    //The selected certificate
    certificate = (X509Certificate2)certificates[0];
}
else
{
    //The user didn't select a certificate
    return "El usuario canceló la selección de un certificado";
}
//Check certificate's atributes to identify the type of certificate (censored)
if (certificate.Issuer != "CN=............................., OU=................., O=..., C=US")
{
    //The selected certificate is not of the needed type
    return "El certificado seleccionado no corresponde a un token ...";
}
//Check if the certificate is issued to the current user
if (!certificate.Subject.ToUpper().Contains(("E=" + pUserADLogin + "@censoreddomain.com").ToUpper()))
{
    return "El certificado seleccionado no corresponde al usuario actual";
}
//Check if the token is currently plugged in
XmlDocument xmlDoc = new XmlDocument();
XmlElement element = xmlDoc.CreateElement("Content", SignedXml.XmlDsigNamespaceUrl.ToString());
element.InnerText = "comodin";
xmlDoc.AppendChild(element);
SignedXml signedXml = new SignedXml();
try
{
    signedXml.SigningKey = certificate.PrivateKey;
}
catch
{
    //USB Token is not plugged in
    return "El token no se encuentra conectado al equipo";
}
DataObject dataObject = new DataObject();
dataObject.Data = xmlDoc.ChildNodes;
dataObject.Id = "CONTENT";
signedXml.AddObject(dataObject);
Reference reference = new Reference();
reference.Uri = "#CONTENT";
signedXml.AddReference(reference);
//Attempt to sign the data. The user will be prompted to enter his PIN
try
{
    signedXml.ComputeSignature();
}
catch
{
    //User didn't enter the correct PIN
    return "Hubo un error confirmando la identidad del usuario";
}
//The user has signed with the correct token
return String.Format("El usuario {0} ha firmado exitosamente usando el token con serial {1}", pUserADLogin, certificate.SerialNumber);

Sources:

http://stormimon.developpez.com/dotnet/signature-electronique/ http://stormimon.developpez.com/dotnet/signature-electronique/(法语)https://www.simple-talk.com/content/print.aspx?article=1713 https://www.simple-talk.com/content/print.aspx?article=1713(用英语讲)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C# 从安全令牌获取信息 的相关文章

随机推荐

  • 如果没有有效的选择,如何返回到第一个 if 语句

    如果没有正确满足条件 如何让 Python 移动到 if 语句的顶部 我有一个基本的 if else 语句 如下所示 print pick a number 1 or 2 a int raw input gt if a 1 print th
  • 从鼠标坐标到 3d 的点-三角形相交?

    我知道如何测试点和三角形之间的交点 但是我不明白 如何使用鼠标坐标将点的起始位置精确地移动到屏幕平面上 因此点角度应该根据鼠标光标在屏幕上的位置而变化 这也应该起作用完美的是 无论我在 OpenGL 应用程序中使用哪个透视角度 因此不同透视
  • 如何删除fiddler安装的根CA证书

    Fiddler 有助于添加唯一的根 CA 证书来拦截 HTTPS 流量 添加此证书后 如何删除它 两种方式之一 1 禁用 HTTPS 解密并单击标题为 删除拦截证书 的按钮 2 打开 CertMgr msc 打开个人和受信任存储 然后使用根
  • 以编程方式复制 WPF 控件

    我有一个选项卡控件 当用户想要添加到它时 我想复制几个已经存在的元素 而不仅仅是引用它们 现在 到目前为止我只是硬复制了我想要的变量 但我在自动调整大小代码中出现了裁剪器 也就是说 在调整窗口大小时 复制的元素明显落后于原始元素 此外 随着
  • HTML5 视频暂停时显示海报图像或暂停按钮?

    您好 我正在为 iPad 编写一个本地网站 并且有一个没有控件的视频 点击时会播放和暂停 视频暂停时能否显示海报图片 或者在中间显示一个暂停按钮 这是我用于播放和暂停的代码
  • Pandas - Groupby 数据帧存储为数据帧而不聚合

    我是 Pandas 的新手 我在这里阅读了很多文档 帖子和答案 但我一直无法辨别出实现我的目标的好策略 抱歉 如果它已经得到解答 我找不到它 这是我所拥有的 df key A B A B value 2 2 1 1 df pd DataFr
  • Django 有办法打开 HTTP 长轮询连接吗?

    保持连接打开 直到事件发生 看一下姜戈 彗星 推 万恶之中最小的 https stackoverflow com questions 4310706 django comet push least of all evils or Pytho
  • 如何在 Android 上使用带有 c 和 java api 的库项目

    我在谷歌 android ndk 组中问过这个问题 但没有得到任何答案 我正在尝试通过单击在独立项目中构建通用模块 是图书馆 是日食 该项目同时提供c api 和java api 虽然其中一些 api 是相关的 这意味着将它们分开不是一个好
  • 如何简单地将数据帧的两列相乘? [复制]

    这个问题在这里已经有答案了 我的输入是 a lt c 1 2 3 4 b lt c 1 2 4 8 df lt data frame cbind a b 我的输出应该是 a lt c 1 2 3 4 b lt c 1 2 4 8 d lt
  • 在 Visual Studio 本地使用假域名,无需直接修改主机文件

    我有一个在这里运行的应用程序http 本地主机 10205 http localhost 10205 但我需要它在本地运行http somethingelse com http somethingelse com 这也需要在其他计算机上进行
  • 有没有办法在 Windows 中的 basic_iostream 上获得非锁定流插入/提取?

    我是一名 C 开发人员 主要在 Solaris 和 Linux 上进行编程 直到最近我被迫创建一个针对 Windows 的应用程序 我一直在使用基于 TCP 套接字支持的 C I O 流的通信设计 该设计基于单个线程连续从流中读取 大部分时
  • 将一个单词转换为另一个单词的最短路径

    对于数据结构项目 我必须找到两个单词之间的最短路径 例如 cat and dog 一次仅更改一个字母 我们得到了一个拼字游戏单词列表 用于寻找我们的路径 例如 cat gt bat gt bet gt bot gt bog gt dog 我
  • Cakephp 在 HABTM 关系中保存额外的属性

    我有三个模型主题 颜色和主题颜色 映射具有不同颜色的主题 结构如下 主题 id 名称 属性 图像 颜色 ID 名称 代码 图像 ThemeColor 主题id 颜色id 预览 例如 预览 gt x 主题 具有 a b c 颜色及其相关图像
  • 如何在asp.net中显示HTML表格中的数据

    我正在编写一个 ASP NET 页面 它从数据库读取数据并需要将其显示在 HTML 表中 我不想使用 gridView 这是我尝试使用 c 的代码 protected void Page Load object sender EventAr
  • ASP.NET 2.o 页面的 jQuery 登录模式弹出窗口

    我有一个 ASP NET 网页 不是 MVC HomePage aspx 和另一个页面 PRiceList aspx 我的主页中有一个登录功能 因此 当用户登录该网站时 他们可以转到Pricelist aspx 页面可以轻松地使用主页中的链
  • 在mlr和parallelMap中可以并行化多个级别吗?例如 mlr.tuneParams 和 mlr.benchmark

    我正在使用多个学习器 大约 15 个不同的学习器 运行 mlr 基准测试 并使用 irace 调整控件进行嵌套重采样 我的问题是 是否可以在parallelMap 上运行两个并行化级别 如果我使用 mlr benchmark 级别 则速度更
  • MS-SQL 中是否有等效的“START AT”?

    一些数据库支持以下命令 SELECT TOP 10 START AT 10 FROM table 本质上 我需要提取前 10 条记录 然后是下 10 条记录 然后是下 10 条记录 等等 也许还有另一种方法可以做到这一点 但在过去 我对支持
  • 添加类型参数约束以防止抽象类

    如果抽象类的具体实现没有默认构造函数 是否可以将类型参数限制为这些具体实现 例如 如果我有 public abstract class Animal private Animal public Animal string name publ
  • Android 视图在某些设备上的边框问题

    已解决的主题 回答如下 一些用户报告了某些 Android 组件 例如警报弹出窗口或 editTexts 的边框对齐问题 这种情况发生在 Samsung Galaxy Apollo 200x400 和 HTC Pro Touch 480x6
  • 如何使用 C# 从安全令牌获取信息

    我需要让我的应用程序的用户能够使用他们的个人 USB 安全令牌签署批准 我已成功签署数据 但无法获取谁的令牌已用于执行此操作的信息 这是我到目前为止的代码 CspParameters csp new CspParameters 1 Safe