jjzjj

c# - 在这种情况下,我们是否应该开发自定义成员资格提供程序?

coder 2024-05-27 原文

总结

长话短说,我们的任务是分解一个相当老旧且臃肿的 asp.net 应用程序的身份验证和授权部分,该应用程序以前所有这些组件都是从头开始编写的。由于我们的应用程序不是典型的应用程序,而且我们都没有使用 asp.net 内置成员资格提供程序的经验,我们不确定是否应该再次推出我们自己的身份验证和授权,或者我们是否应该尝试在asp.net 成员(member)提供商的心态并开发我们自己的成员(member)提供商。

我们的应用

我们有一个相当古老的 ASP.NET 应用程序,它安装在客户位置,为 LAN 上的客户提供服务。管理员创建用户(用户无需注册),根据安装情况,我们可能会将软件与 LDAP 集成。

目前,LDAP 集成将用户批量导入我们的数据库,当他们登录时,它会根据 LDAP 进行身份验证,因此我们不必管理他们的密码。没有什么了不起的。

管理员可以将用户分配到 1 个组,他​​们可以更改该组的授权以管理对软件各个部分的访问。

组由管理员(基于 Web 的 UI)维护,如前所述,授予/拒绝应用程序中某些功能的权限。

所有这些都是完全从头开始编写的,没有使用任何内置的 .net 授权或身份验证。我们确实有 IsLoggedIn()检查登录并重定向到我们的登录页面(如果不是)的方法。

我们的重写

我们的任务是与 LDAP 更紧密地集成,他们希望我们将应用程序中的组与 LDAP 中的组(或 LDAP 使用的任何类型的容器)联系起来,这样当客户选择使用我们的 LDAP 集成时,他们没有在 LDAP 和我们的应用程序中管理他们的用户。

新方式,他们只需在 LDAP 中创建用户,将他们添加到 LDAP 中的组,我们的应用程序将看到他们属于适当的 LDAP 组,并对他们进行身份验证和授权。

此外,我们已获准完全删除用户身份验证和授权代码并完全重新执行。

我们的问题

问题是我们中没有人对 asp.net 成员资格提供程序功能有任何经验。我对它的一点接触让我担心它不打算用于像我们这样的应用程序。不过,开发我们自己的 ASP.NET 成员身份提供程序和角色管理器听起来会是一次很棒的体验,而且很可能是合适的做法。

基本上,我正在寻求建议,我们应该使用 ASP.NET Membership provider & Role Management API 还是应该继续推出我们自己的 API?我知道这个决定会受到我们要求的影响,所以我会在下面讨论它们

我们的要求

只是一个快速的脏 list

  • 保持拥有用户数据库并对其进行身份验证的能力,并赋予管理员(仅而非用户)权限 CRUD用户
  • Allow the site to integrate with LDAP, when this is chosen, they don't want any users stored in the DB, only the relationship between Groups as they exist in our app/db and the Groups/Containers as they exist in LDAP.
  • 正在使用 .net 3.5(asp.net webforms 和 asp.net mvc 的混合)
  • 必须在 ASP.NET 和 ASP.NET MVC 中工作(我猜应该不是问题)
  • 这不能以用户为中心 , 管理员必须是唯一的 CRUD (或通过 ldap 导入)用户和组
  • 当 LDAP 配置为这样做时,我们必须能够通过 LDAP 进行身份验证

  • 我总是尽量密切关注我的问题,所以请随时询问更多信息。此外,作为我在答案中寻找的内容的一般摘要。 “您应该/不应该使用 xyz,这就是原因”。

    非常欢迎有关 asp.net 成员资格提供程序和角色管理内容的链接,我发现的大部分内容已有 5 年以上的历史。

    最佳答案

    问题上下文中的安全性涉及两个单独的操作:身份验证和授权,它们在 .NET 中分为 MembershipProviders 和 RoleProviders。我强烈建议同时使用(意味着自定义或内置)来进行身份验证和授权。如果您以后找到更好的工具来完成这项工作,这样做可以提供升级途径,并使其他开发人员更容易理解安全性。

    现在,对于身份验证,正如其他人所说,我会使用 SqlMembershipProviderActiveDirectoryMembershipProvider .我的经验是,在 99% 的情况下,ActiveDirectoryMembershipProvider为针对完整 AD 存储(即不是 ADAM 又名 ActiveDirectory 应用程序模式)工作时所需的功能提供足够的功能。我在使用 ActiveDirectoryMembershipProvider 时遇到问题在多域情况下,但总的来说,找到一种使用它的方法而不是滚动自己的方法要好得多。同样,SqlMembershipProvider用于身份验证,运行良好且可扩展。

    然而,授权是完全不同的鱼。这才是真正感受到你痛苦的地方。首先,没有“ActiveDirectoryRoleProvider”。这意味着如果您想与 AD 组集成,您有三个选择:

  • 使用 AzMan
  • 通过自定义 RoleProvider 自己做
  • 找一个为你做过这件事的人。
  • 使用 ADFS 或 Microsoft 的新联合服务

  • 选择 1:阿兹曼
    AzMan (Authorization Manager) (另请参阅 Windows Authorization Manager )是 Microsoft 编写的用于管理应用程序授权的工具。 AzMan 有一些不错的功能:
  • 它可以将您的角色链接到 AD 组(或 Windows 组)
  • 它可以存储为文件,以便您可以将其保存在应用程序中。
  • 很好地将授权分解为任务、操作和角色。
  • 带有单独的管理工具
  • 2008 版本将与 SQL 身份验证存储交互。

  • 问题是 AzMan 可能是一个开发对象,并且了解该工具不适合没有经验的人。我发现文档很少,但那是几年前的事了。此外,AuthorizationStoreRoleProvider不支持任务,即使 AzMan 本身支持。任务是可以完成的最细粒度的事情,它们被分组到操作中,操作本身可以分组到角色中,用户或 AD 组可以被删除到角色中。文档已经变得更好了。我确实知道,当我上次使用 AzMan 时,由于缺乏与数据库身份验证存储的继承交互,因此使用起来有点麻烦。

    选择 2:自己写 RoleProvider

    这可能是 LDAP 的痛苦经历。如果您打算使用 SqlRoleProvider,如果您想查询 AD 组并且不想使用 AzMan,则您只需要一个自定义 RoleProvider。在非 AD 环境中。

    我使用的另一个替代方法是管理数据库中的角色并允许 MembershipProvider随心所欲。这仍然需要编写自定义提供程序(但要简单得多),并且可以轻松地将应用程序移动到 AD 环境中,而且不会造成困惑。如果您将角色存储在数据库中,并且如果您希望允许管理员将多个级别的组与您的角色相关联,那么您必须将其写入您的自定义 RoleProvider 中。 .

    如果您打算使用 SqlRoleProvider您也可能会遇到一些问题。如果您使用 SqlRoleProviderSqlMemberProvider在单个应用程序环境中,它会工作得很好并且很容易设置。但是,如果您有多个应用程序要针对单个存储进行身份验证,则 SqlRoleProvider未经修改,在所有情况下开箱即用将无法正常工作。

    选择 3:找一个为你做过这件事的人。

    具体来说,我的意思是找到开发了 ActiveDirectoryRoleProvider 的人。 .你可以很容易地在谷歌上找到各种选择,但我没有使用它们,并且想要倾诉任何与我的应用程序中的安全性有关的代码。

    选项 4:Active Directory Federated Services

    微软确实一直在插入这个解决方案,如果你可以让它工作的话,它确实 promise 单点登录。此解决方案的关键在于设置它,尤其是在您和合作伙伴之间。

    关于c# - 在这种情况下,我们是否应该开发自定义成员资格提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2524327/

    有关c# - 在这种情况下,我们是否应该开发自定义成员资格提供程序?的更多相关文章

    1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

      我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

    2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

      为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

    3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

      我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

    4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    5. ruby - 默认情况下使选项为 false - 2

      这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

    6. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

      我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

    7. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

      我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

    8. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

      我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

    9. Ruby Sinatra 配置用于生产和开发 - 2

      我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

    10. ruby - 在 Ruby 中有条件地定义函数 - 2

      我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

    随机推荐