如何使用证书而不是密码进行身份验证?

2023-11-21

我正在构建一个小型 C# MVC5 应用程序,并准备向其中添加用户安全模块。 (之前我只是创建了一个会话变量来测试角色)但是,我的安全需求不适合我见过的任何预构建的安全模块,即 SimpleMembership 等。

总结一下我的情况和需求:

  • 没有密码——用户名/密码身份验证是not allowed

  • 用户使用带有客户端证书的智能卡在 Web 服务器级别进行身份验证 - 我不管理服务器,也永远不会看到他们的卡

  • IIS 填充 Request.ClientCertificate 和其他一些内容,这是我有权访问的所有内容

  • 我的应用程序将有专用的用户帐户 - 不使用 Windows 身份验证等 - 所以更像是用户名/密码系统,无需输入用户名或密码

  • The server正在验证他们的访问权限server通过使用某种形式的 Windows 身份验证及其智能卡证书,但我不能,我只需要接受加载到请求集合中的证书

  • 用户表存储在 SQL Server 中(目前...)

  • 不想使用 EntityFramework,因为所有应用程序数据都来自 Oracle 数据库,并试图获得批准将身份验证/授权表移入其中并消除来自两个数据库的工作,并且 EF for Oracle 不适用于我们的环境,所以我' m 使用 OleDb 代替:(

实施这样的计划的最佳方法是什么?我开始做的是构建三个表——Users、Roles 和 UserRoles——并且 Users 表保存(字符串)ClientCertificate 的副本。进来的用户将通过拉取 Request.ClientCertificate 并查找匹配的用户记录,然后从 UserRoles 获取角色列表来对应用程序进行身份验证。用户对象将存储在包含用户和角色信息的会话中,并且将在控制器上使用属性来通过要求某些角色来控制访问。

(我们有另一个应用程序使用这种基本方法,但它是 Linux 上的 J2EE,所以我不能只重用它的代码)

然而,我也开始阅读有关 IIdentity 和 IPrincipal 的内容,但我不是 100% 清楚这是否是我可以使用的东西。显然我更喜欢使用专家设计的安全模型。那么我应该使用继承自 IIdentity 和 IPrincipal 的自定义类来构建我的身份验证系统吗?或者我应该使用其他方法吗?

完全有可能可以定制像 SimpleMembership 这样的东西来满足我的需求,但如果是这样,我不知道。

感谢您的建议,非常感谢。


你可以使用微软的身份对于这种高级场景也是如此。身份如此模块化,您可以将任何数据存储与您想要的任何模式一起使用。 Identity 中的身份验证密码不是必需的,您可以实现自己的场景。考虑这个简单的例子:

// imaging this action is called after user authorized by remote server
public ActionResoult Login()
{
    // imaging this method gets authorized certificate string 
    // from Request.ClientCertificate or even a remote server
    var userCer=_certificateManager.GetCertificateString();

    // you have own user manager which returns user by certificate string
    var user=_myUserManager.GetUserByCertificate(userCer);

    if(user!=null)         
    {
        // user is valid, going to authenticate user for my App
        var ident = new ClaimsIdentity(
            new[] 
            {
                // since userCer is unique for each user we could easily
                // use it as a claim. If not use user table ID 
                new Claim("Certificate", userCer),

                // adding following 2 claim just for supporting default antiforgery provider
                new Claim(ClaimTypes.NameIdentifier, userCer),
                new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),

                // an optional claim you could omit this 
                new Claim(ClaimTypes.Name, user.Name),

                // populate assigned user's role form your DB 
                // and add each one as a claim  
                new Claim(ClaimTypes.Role, user.Roles[0].Name),
                new Claim(ClaimTypes.Role, user.Roles[1].Name),
                // and so on
            },
            DefaultAuthenticationTypes.ApplicationCookie);

        // Identity is sign in user based on claim don't matter 
        // how you generated it Identity take care of it
        HttpContext.GetOwinContext().Authentication.SignIn(
            new AuthenticationProperties { IsPersistent = false }, ident);

        // auth is succeed, without needing any password just claim based 
        return RedirectToAction("MyAction"); 
    }
    // invalid certificate  
    ModelState.AddModelError("", "We could not authorize you :(");
    return View();
}

正如您所看到的,我们授权用户和填充的角色,而不依赖于用户名、密码和任何数据存储,因为我们使用了自己的用户管理器。

一些用法示例:

[Authorize]
public ActionResult Foo()
{
}

// since we injected user roles to Identity we could do this as well
[Authorize(Roles="admin")]
public ActionResult Foo()
{
    // since we injected our authentication mechanism to Identity pipeline 
    // we have access current user principal by calling also
    // HttpContext.User
}

这是一个简单的示例,您可以实现自定义场景扩展IIdenity以及。阅读我的其他类似答案,例如this and this有关更多示例,了解如何通过以下方式完成几乎所有操作Claims.

您也可以浏览和下载基于令牌的身份验证示例repo 作为一个简单的工作示例。

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

如何使用证书而不是密码进行身份验证? 的相关文章

随机推荐

  • 如何在Fragment内的WebView中添加“返回”功能?

    更新 解决了 问题与我的 Viewpager 有关 而不是与 WebView 有关 我正在尝试向我的应用程序添加 返回 功能WebView这是在一个Fragment 但我不知道如何 public final class TestFragme
  • 默认模型绑定器的 MVC 本地化

    我目前正在尝试找出如何本地化 MVC 生成的错误消息 让我使用默认的模型绑定器作为示例 以便我可以解释问题 假设我有一个表单 用户可以在其中输入他们的年龄 然后用户在表单中输入 十 但没有得到预期的错误 年龄必须在 18 岁至 25 岁之间
  • Spring security自定义AuthenticationException消息

    您好 我需要在 Spring 安全登录表单中添加一个新的异常 除了我想要自己的错误消息 到目前为止它显示 错误的登录 密码 之外 一切都运行良好 我已覆盖用户名密码身份验证过滤器中的默认尝试身份验证方法 Override public Au
  • 从 firestore 获取数据时使用 async forEach 循环

    我的 firestore 数据有点像这样 Support userid abcdxyz message hello 我正在使用 nodejs 来获取我的数据 我还想显示发送此消息的人的电子邮件地址和姓名 所以我正在使用以下函数 databa
  • 未解决的外部噩梦

    各位行业资深人士 大家好 我是一名大三学生 即将开始我的第一次暑期编程实习 但我的能力已经超出了我的能力范围 我工作的公司从另一家公司购买了一个庞大的应用程序 该公司自 90 年代初以来一直在慢慢扩展和修改它 该解决方案包含超过 200 0
  • Java GUI 中的旋转方形面板

    我想知道是否可以实现一个方形但旋转 90 度的 GUI 面板 可能是 JPanel 显然 将有一个包含此面板的顶级容器 并且从视觉上看 主面板就是其中的旋转方形面板 更具体地说 我会将一个面板 称为 A 分成 4 个相等的方形子面板 并用
  • 智能手机网页设计 - 像素大小

    我需要有人帮助澄清我对高密度屏幕新手机像素大小的理解 从那时起 它就给我的网页设计带来了麻烦 我对智能手机的最初理解是像素尺寸大约为 480 x 320 这使得设计变得容易 因为像素仍然是相同的像素 然而 一些智能手机比这个多一倍 或更多
  • 如何“平滑”数据并计算线梯度?

    我正在从测量距离的设备读取数据 我的采样率很高 因此我可以测量距离 即速度 的较大变化 但这意味着 当速度较低时 设备会提供许多相同的测量结果 由于设备的粒度 这会产生 阶梯式 曲线 我需要做的是平滑曲线以计算速度 接下来我需要计算加速度
  • 如何使用Java代码将图像权限模式更改为777?

    我想使用Java代码为图像文件赋予权限模式值 777 我怎样才能用Java给出这个呢 因为我无法删除默认权限模式 664 的图像 您可以使用 exec 方法运行外部命令来执行 chmod Runtime getRuntime exec ch
  • 单个 Jekyll 网站中的多个博客

    有没有一种方法可以让一个 Jekyll 网站拥有多个博客 我目前想在一个网站上拥有两个博客 我是该页面的作者http www garron me blog multi blog site jekyll html 考虑到您需要单独的档案页面以
  • 从 ASP.NET 生成 Word 文档的最佳解决方案是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想从我的 ASP NET 应用程序生成一个 Word 文档 目前我们显示 议程列表 其中包含议程信息和所有项目 主题 该页面需要能够在word中打
  • $(window).scroll(function() 在 Firefox 上不起作用?

    为了像 facebook 或 twitter 在其网站上那样加载页面 向下滚动 我用 jquery 尝试过 window scroll function if window scrollTop document height window
  • 传输编码:Windows Phone 中的分块

    我有一个带有 Transfer Encoding chunked 的服务器响应 HTTP 1 1 200 OK Server nginx 1 2 1 Date Mon 18 Feb 2013 08 22 49 GMT Content Typ
  • 如何合并两个不同的 Git 存储库?

    我有两个 Github 存储库 一个存储库位于远程服务器上 另一个存储库位于本地服务器上 它们都有不同文件和文件夹的不同提交历史记录 现在我想合并它们 以便我可以将它们作为一个存储库放在远程服务器上 请帮忙 我寻找了各种解决方案 建议如下
  • JS Promise - 立即从返回 Promise 的函数中检索一些数据

    谁能推荐一种从返回 Promise 的函数中立即检索数据的模式 我的 简化的 示例是 AJAX 预加载器 loadPage index html then displayPage 如果这是下载一个大页面 我希望能够检查正在发生的情况 并可能
  • 有没有办法确定理想的线程数? [复制]

    这个问题在这里已经有答案了 我正在做一个网络爬虫并使用线程来下载页面 我的程序性能的第一个限制因素是带宽 我永远无法下载它可以获得的更多页面 第二件事是我感兴趣的 我使用线程同时下载许多页面 但是当我创建更多线程时 会发生更多的处理器共享
  • R Dataframe 中的级别

    我从 csv 文件导入数据 并附加数据集 我的问题 一个变量是整数形式 有 295 个级别 我需要使用这个变量来创建其他变量 但我不知道如何处理这些级别 这些是什么 我该如何处理它们 当您使用 read table 或 read csv 您
  • 是否可以将动态程序集保存到磁盘?

    最近买了阿延德的书在 Boo 中构建 DSL 购买它 阅读它 太棒了 但是我遇到了一个实现问题 我想看看生成的代码是什么样的 我通常会使用反射器来查看代码 但在这种情况下 程序集是动态的并且仅在内存中 有没有办法将动态程序集保存到磁盘以便我
  • 覆盖路由器并向特定路由添加参数(在使用路径/url 之前)

    我会使用一个简单的管理路由系统 例如现在我有这条路线 welcome ANY ANY ANY acmedemo example index ANY ANY ANY acme demos acmedemo example edit ANY A
  • 如何使用证书而不是密码进行身份验证?

    我正在构建一个小型 C MVC5 应用程序 并准备向其中添加用户安全模块 之前我只是创建了一个会话变量来测试角色 但是 我的安全需求不适合我见过的任何预构建的安全模块 即 SimpleMembership 等 总结一下我的情况和需求 没有密