如何使用户从唯一一台机器(通过获取CPU Serial)登录到ASP.NET-MVC Web应用程序

2024-01-02

设想:

我已经使用个人用户帐户部署了 Web ASP.NET-MVC 5 应用程序:Identity 2.x。每个用户都有一个电子邮件和密码来通过浏览器登录网络应用程序,这意味着用户可以通过任何具有互联网浏览器的设备登录。

我想启用用户登录,条件是他每次登录时都使用完全相同的 PC 类计算机。

我可以礼貌地要求用户运行any桌面 .NET(.exe) 应用程序(如有必要)。如果需要插件来实现此目的,我还可以要求用户使用 Chrome 浏览器。从字面上看,我可以假设任何事情。该解决方案可能会很不舒服,但没关系。

我的半解决方案:

  1. 通过桌面(我们称之为 Authorizer.exe)应用程序获取 CPU 序列号,该应用程序会在登录时将此唯一 ID 发送到 ASP.NET-MVC Web 应用程序,以授权用户使用特定 PC。 Authorizer.exe 将通过嗅探通过网络的数据包来检测对 Web 应用程序的登录。 加 检测用户的位置,防止他移动计算机。

  2. 创建桌面应用程序,该应用程序只能通过网络应用程序提供的唯一序列激活一次。只有打开此桌面应用程序才能登录 ASP.NET-MVC。(我不知道该怎么做)。

我为什么要问这个问题:

如果有人窃取了用户的电子邮件和密码,我不想让小偷能够登录但对我来说最重要的是我不想让用户从不同的设备登录。


我能想到的唯一解决方案是颁发客户端证书,并在您的应用程序中使用证书身份验证。

管理证书

要管理证书,您需要实施 PKI,这需要:

  • 获取颁发证书所需的证书颁发机构(可以是公共 CA,也可以使用自签名证书)
  • 使用 CA 为您的 Web 服务器颁发证书
  • 将您的应用程序配置为通过 HTTPS 运行,并需要证书身份验证
  • 为您的用户颁发证书并将其安装在他们的浏览器中

确保用户无法将证书移动到其他计算机

薄弱环节是最后一个。您必须注意如何安装以及如何颁发证书。

在用户浏览器上安装证书

在浏览器中安装证书。你可以:

  • 创建证书文件,用于在浏览器中导入证书
  • 使用 PKI 基础设施(证书服务器),允许通过使用浏览器访问页面来请求证书,并且在证书颁发后(即其请求被接受),需要使用相同的浏览器在其中安装证书。

注意:在这两种情况下,您都必须接受请求并颁发证书或拒绝它。证书不会自动颁发

第一个选项有一个问题:如果您将证书发送给您的用户,他将能够在任何计算机上安装它任意次数。要解决此问题,您需要访问用户的计算机,复制文件,安装它,然后删除它。第二种选择解决了这个问题。

第二种选择更安全。但有足够知识的用户仍然可以在此过程中恢复服务器颁发的文件,并将证书安装在不同的位置。

使私钥不可导出

另一个需要考虑的非常重要的一点是,当您颁发证书时,通常有一个选项允许其私钥可导出。如果设置此选项,用户可以从安装它的浏览器导出 PK,并将其安装在其他地方。显然你想避免这种情况。因此,禁用此选项。

使用此选项,用户仍然可以导出证书,但没有其私钥,因此无法将其安装在其他地方。

设置 PKI

我没有提供有关如何设置 PKI 的更多详细信息,因为它很大程度上取决于基础设施(操作系统和版本)。如果您想了解有关证书和 PKI 的更多信息维基百科条目“X.509” http://en.wikipedia.org/wiki/X.509 and PKI 的维基百科条目 http://en.wikipedia.org/wiki/Public_key_infrastructure。然后,您可以查找有关在特定基础设施 (OS) 中设置 PKI 的其他信息。

本系统的安全性

您可以放心,这个系统确实安全:例如,在我的国家,您可以通过这种方式识别自己的身份,以进行很多“官方”的事情,例如申报和纳税。

吊销证书

而且,如果您想知道如果您想拒绝已拥有证书的用户的访问会发生什么。答案是,您可以随时撤销证书,这样服务器就不会允许您的用户使用其证书进行身份验证,因为它已被撤销。

用户和机器安全

另一件让您担心的事情是其他用户使用同一台机器并登录到您的应用程序。由于以下原因,它比看起来更难:

  • 仅当您使用安装该证书的同一用户登录计算机时,该证书才可用
  • 安装证书时,您可以让操作系统在有人想要使用该证书时请求密码
  • you can make your app to have double authorization:
    • 首先,证书授权(这实际上是由IIS本身处理的)
    • 其次,要求提供用户名和密码(或使用证书的用户名,并要求提供与用户关联的附加密码)

编辑:肮脏的解决方案,以及所有解决方案中的女王evercookie,它将数据存储在 12 个不同的可想象和不可想象的地方

我见过很多答案,建议使用一种“神奇的方式”来识别用户的机器,而用户不知道并接受它,或者可能会被某些用户操作破坏。这些解决方案不稳定,甚至可能不合法。此外,所解释的解决方案都不是可靠的或易于实施的,但我将在我的回答结束时向您提供解决方案。但在此之前,请允许我解释一下为什么我更喜欢证书解决方案。

安装已颁发的证书不会对用户隐藏,并且除非用户故意删除证书,否则无法破坏该证书。用户可以被告知他需要证书才能访问应用程序,因此您既不会作弊,也不会“变魔术”来识别他的机器。这是一个干净、受支持且有文档记录的解决方案。此外,证书不能被破解或黑客攻击(严格意义上来说,一切都可以被破解或黑客攻击,但这太难破解了)。除此之外,同一个证书可以由所有浏览器共享,因为它不是安装在浏览器中,而是安装在计算机的证书存储中。因此,即使用户使用不同的浏览器打开应用程序,证书仍然存在。并且很容易检查身份验证问题是否是缺少证书(或与之相关的东西)。

但是,如果您仍然希望实现一种无需用户批准即可识别用户计算机的解决方案,或者无需解释其工作原理,则可以使用“supercookies”。如果你用谷歌搜索 thister,你会发现很多地方都利用了闪存。甚至Flash + HTML5 存储。或者它甚至可以使用许多其他位置来存储所需的信息。但你会发现这种技术并不受欢迎。并且可以对抗低点并让你陷入困境。不过,话虽如此,如果你仍然想做这种“肮脏”的事情,你可以使用evercookie。它是用 JavaScript 实现的,您可以从此链接查看信息并下载代码:

  • http://samy.pl/evercookie/ http://samy.pl/evercookie/

免责声明:如果你使用这个邪恶的东西并陷入某种麻烦,请不要怪罪我!我告诉你了!

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

如何使用户从唯一一台机器(通过获取CPU Serial)登录到ASP.NET-MVC Web应用程序 的相关文章

  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • 如何从当前 .NET 表单/应用程序发送密钥 F12

    我非常确定以下按钮激活的表单代码应该在我的 C 应用程序中引发 Control F12 SendKeys F12 但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序 我的键盘可以用 看起来发送键在某处被拦截 并
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • 同源政策目的可疑

    正如我所读到的 同源策略是防止源自 邪恶 域 A 的脚本向 良好 域 B 发出请求 换句话说 跨站点请求伪造 玩了一下我了解到的Access Control Allow Origin标头和CORS据我了解 它允许从好域 B 指定服务器 域
  • 为什么我不能在扩展 List 的类中调用 OrderBy?

    我有一堂课 Deck 其中包含一个名为的方法Shuffle 我正在致力于重构Deck延长List
  • SqlConnection - 是远程连接还是本地连接?

    如果我有 SqlConnection 对象 如何确定它是本地连接 localhost 或 127 0 0 1 还是远程连接 本地区域的其他计算机 使用连接询问 SQL 语句 SELECT SERVERNAME 然后验证这是否与客户端计算机的
  • 实体框架 SQLite 错误 1:“没有这样的表:__EFMigrationsHistory”

    我在 Windows 和 Linux 上运行 EF Core 并且在两者上都遇到相同的问题 public string DbPath get string DbPath Environment GetFolderPath Environme
  • Visual Studio Intellisense 颜色编码不起作用

    现在 在我的代码中 突然有些代码的颜色未编码为 Visual Studio 经典主题颜色 我不确定我的代码中是否存在错误 但是当我定义某些属性时 例如 public class VideoEncodeTest AndroidPowerTes
  • C# 最小化所有打开的窗口

    我在论坛上看到了这个 C 代码 它最小化了所有打开的窗口 define MIN ALL 419 define MIN ALL UNDO 416 int main int argc char argv HWND lHwnd FindWindo
  • Microsoft 帐户 JWT 身份验证令牌如何签名?

    在我的 Web 应用程序中 我需要验证从 Live SDK 5 6 获取的 JWT 身份验证令牌 不久前 这些令牌的签名是使用签名密钥的 Base64 编码标头 有效负载的 HMACSHA256 哈希 该签名密钥是应用程序秘密 来自 acc
  • 在音频文件中查找音频样本(频谱图已存在)

    我正在努力实现以下目标 使用 Skype 拨打我的邮箱 有效 输入密码并告诉邮箱我要录制新的欢迎信息 有效 现在 我的邮箱告诉我在嘟嘟声后录制新的欢迎消息 我想等待蜂鸣声然后播放新消息 不起作用 我如何尝试实现最后一点 使用 FFT 和滑动
  • C# HTTP 请求解析器[重复]

    这个问题在这里已经有答案了 可能的重复 将原始 HTTP 请求转换为 HTTPWebRequest 对象 https stackoverflow com questions 318506 converting raw http reques
  • 如何更改特定元素的 XML 命名空间

    我有一些通过某些 WCF 消息的 xmlserialization 生成的 xml 集 现在我想创建一个通用方法 在其中提供 xml 文件名和前缀 例如mailxml12 然后在 xml 文件中 那些名称中没有任何命名空间前缀的元素应替换为
  • 缺少嵌入互操作类型属性

    在一个 C 项目中 我收到以下警告 警告 CS1762 创建了对嵌入式互操作程序集 Interop SomeLibrary dll 的引用 因为间接引用了程序集 ALibraryOfMine dll 创建的该程序集 考虑更改任一程序集的 嵌
  • ASP.NET MVC 站点中的覆盖视图不起作用

    我的解决方案中有一个单独的项目 其中包含一些控制器和编译的视图 我将这些控制器用作 MVC 应用程序中其他控制器的基类 并使用 RazorGenerator 编译视图 可以说B是具有非抽象操作方法的基本控制器一些动作返回视图 MyView
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 包恢复失败。回滚包更改 - Serilog.AspNetCore

    我有一个 asp net Core 项目 我正在尝试向其中添加一个记录器 我选择了我在其他项目中使用过的 SeriLog 但是当我尝试添加 Serilog AspNetCore 我得到的软件包版本 2 0 0 包恢复失败 回滚 后端 的包更
  • 将键码转换为相关的显示字符

    在 C Windows Forms 项目中 我有一个不提供 KeyPressed 事件的控件 它是一个 COM 控件 ESRI 映射 它仅提供 KeyUp 和 KeyDown 事件 包含关键事件参数 http msdn microsoft

随机推荐

  • document.ActiveElement 不返回 Safari 中的活动元素

    在我正在编写的网站中 需要在发生某些事情之前显示一些确认文本 我使用的解决方案在单击按钮时显示一个模式窗口 当窗口关闭时 Jquery 会查看单击了哪个按钮 所以我有以下注销确认信息 function logOut on click fun
  • 无法更新 XCode:空间不足[重复]

    这个问题在这里已经有答案了 我正在尝试将 XCode 从 11 2 1 更新到 12 4 我从应用程序商店安装了 XCode 因此我尝试从那里更新它 我有 27 GB 的可用空间 但每次尝试更新时 都会提示我没有足够的空间 我不认为还有什么
  • Neoclipse 的替代品 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在玩neo4j来用JAVA存储一些数据 我希望有一个好方法来可视化我的 neo4j 数据库并查看属性等 主要是为了获得反馈并了解我在数
  • macOS 应用程序:处理绑定到全局键盘快捷键的组合键

    在某些应用程序中 应用程序直接处理键盘快捷键是有意义的 否则这些快捷键将绑定到系统范围的组合 例如 Space 通常是 Spotlight 或 Tab 通常是应用程序切换器 这适用于各种 Mac 应用程序 例如 VMWare Fusion
  • 将子元素范围包装在 div 中

    我试图将一系列子元素包装在 div 中 以便分组操作它们 尝试将每个组定位在不同的位置 场景是我有一个随机生成的列表li标签 无论出现多少个 我都需要单独操作每组十个标签 为了解决这个问题 我使用了一个书面列表 ul li ul li nt
  • ZSH RPROMPT 奇怪的间距?

    这是我的 ZSH 提示主题 function git prompt info ref git symbolic ref HEAD 2 gt dev null return echo parse git dirty ZSH THEME GIT
  • C语言这段代码是什么意思? if(按钮 & 1)==1 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对此很困
  • java.security.AccessControlException:访问被拒绝(java.io.FilePermission

    final File parentDir new File S PDSPopulatingProgram parentDir mkdir final String hash popupateData final String fileNam
  • 定制 Android 电话应用程序

    我认为这是正确的论坛 而不是 android stackechange 因为它与软件相关 我是一名 Java 开发新手 需要创建具有以下功能的自定义 Android 电话应用程序 设备启动时自动启动 以信息亭模式启动 无通知 或访问其他应用
  • 如何隐式转换模板化构造函数参数?

    我正在重载模板类的构造函数A对于标量和容器类型参数 具有不同的输入类型 template
  • 与任何 Excel 操作进行上下文同步时发生内部错误

    我有多个 Excel 工作簿导致 Excel API 抛出异常An internal error has occurred在我们在应用程序中进行的第一次上下文同步中 Excel代码看起来像这样 let range ctx workbook
  • 搜索具有特定文件内容的文件

    我正在尝试编辑许多具有特定文件内容的文件 我需要搜索那些有一些内容的文件 有没有任何软件可以非常准确地进行此类搜索 我尝试使用 Windows 7 进行搜索 但看起来丢失了许多文件 Thanks Windows 本机搜索可能非常有限 我建议
  • 由外部包导出的 React 和 Webpack 渲染组件

    我正在尝试使用外部脚本中公开的 React 组件 捆绑A 在我的主 React 应用程序中 捆绑包B 外部 React header 组件 捆绑A 是通过加载
  • 如何防止groupby超类索引?

    假设您有以下半多索引对象 https pandas pydata org pandas docs stable user guide advanced html creating a multiindex hierarchical inde
  • Visual Studio 调用堆栈窗口不显示文件名

    我正在 Visual Studio 中调试程序 我想知道为什么我的程序会传递到特定单元 源代码文件 中的函数旁边 我以为调用堆栈会显示这一点 但事实似乎并非如此 此外 可显示条目列表甚至没有提及文件名 显示模块名称 显示参数类型 显示参数名
  • html5画布描边样式?

    我正在尝试将图像映射到使用描边样式和画布模拟布料的 3d 网格 我包含该图像 但它当前充当背景图像 实际上并不像波纹那样与 布料 一起流动 即随着网格的流动 图像是静态的 这是jsfiddle http jsfiddle net S7nBq
  • 在 DIV 中换行时缩进文本的最佳方法是什么?

    所以我有一个包含一些动态文本的 DIV 假设我知道文本和字体大小 但不知道 DIV 的大小 我希望 DIV 中文本的显示足够智能 以便在文本换行时显示缩进 假设我的原始文本看起来像这样 Lorem ipsum dolor sit amet
  • JavaScript 回调函数中的变量总是获取循环中的最后一个值? [复制]

    这个问题在这里已经有答案了 我正在尝试执行以下操作 我有一组图像并选择 下拉 HTML 元素 每个元素 30 个 我尝试在从 1 到 30 的循环中使用 AddEventListener 以便当我更改选择的值时 图像 src 会更新 并且图
  • 如何从日期时间中删除时间

    数据库中DATE字段的格式如下 2012 11 12 00 00 00 我想从日期中删除时间并返回日期 如下所示 11 12 2012 首先 如果您的日期采用 varchar 格式 请更改它 将日期存储为日期 https sqlblog o
  • 如何使用户从唯一一台机器(通过获取CPU Serial)登录到ASP.NET-MVC Web应用程序

    设想 我已经使用个人用户帐户部署了 Web ASP NET MVC 5 应用程序 Identity 2 x 每个用户都有一个电子邮件和密码来通过浏览器登录网络应用程序 这意味着用户可以通过任何具有互联网浏览器的设备登录 我想启用用户登录 条