【问题标题】:Which authentication and authorization schemes are you using - and why?您正在使用哪些身份验证和授权方案 - 为什么?
【发布时间】:2010-10-19 22:30:13
【问题描述】:

我们开始设计一大堆要创建的新服务(WCF、ADO.NET 数据服务,可能在某个时候在云中),弹出的一个问题是使用什么身份验证和授权方案 - 那里不少!

我们基本上需要能够识别各种协议(HTTP、HTTPS、TCP)上的用户(实际人员和“虚拟”应用程序/服务用户),并且我们需要为他们分配至少一堆角色/ 查看某些数据和/或执行某些操作的权限。

我们绝对不能单独使用 Windows 组成员资格 - 我们有大量服务的外部消费者,我们不希望必须在我们的内部域中为每个人设置域帐户。

所以我认为主要有三个选项:

  1. 使用 ASP.NET 会员系统 - 在那里创建用户并分配角色
  2. 使用 AzMan(授权管理器),它似乎是一个更精细、更成熟、更精细的系统(具有用户、任务、组 - 三个级别,而不仅仅是用户 + 角色)
  3. 自己动手

首先 - 您会推荐这三个中的哪一个?有什么理由吗?

其次 - 我还缺少更多选项吗?

感谢任何提示、指点、意见!

马克

PS:看到到目前为止的答案,我对投票给选项 3 的人数之多感到惊讶。我原以为 MS 能够设计出可以处理所有这些要求的可重复使用的东西....

【问题讨论】:

    标签: asp.net authentication asp.net-membership authorization azman


    【解决方案1】:

    其实答案很可能是1和3的组合。

    如果默认选项没有达到您的预期,您可以通过编写 membership、role 或 profile 提供程序来利用框架为您提供的许多工具和功能。喜欢。

    我们已经在许多客户网站上做到了这一点 - 例如,我们的一个客户将他们的大部分用户存储为 Commerce Server 用户,并使用 Commerce Server 个人资料系统,因此我们编写了一个会员和个人资料提供程序来与这些数据存储区对话 - 一个相当简单的练习。


    大多数人可能会选择 3,因为需要通过原始 TCP 进行身份验证 - 这引入了一个超出标准 ASP.NET 成员资格提供程序的层。

    MS 产生的大部分内容都“还可以”或“足够好”,但总会有一些极端情况,您想做一些“不太标准”的事情,这意味着您最终会自己动手。我猜想除了“基本身份验证”或“Windows 身份验证”之外,您的普通开发人员很容易理解,他们选择了“让我们为网络构建这个”的明智选择。

    如果您查看可以针对 WCF 服务进行身份验证的多种方法,您就会明白我的意思 - 这些 旨在处理不同的传输机制,因此要复杂得多.

    也就是说,默认角色和配置文件提供者相当有限(角色:没有层次结构,因此您需要检查每个可能的角色,或明确地将每个角色分配给用户;配置文件:所有存储在一个字段中,以逗号分隔values - 不容易找到所有设置了值的用户)。

    【讨论】:

      【解决方案2】:

      我们使用 (3)。实际上,这有助于我们在集成环境中与帐户同步

      1. 业务流程
      2. 其他系统(并非所有系统都在同一个技术堆栈 (ASP.NET) 上)

      【讨论】:

        【解决方案3】:

        在最近的一个项目中,我们扩展了 ASP.NET 成员资格提供程序(编写了一个自定义提供程序),目的是使用一些基于角色的控件来管理权限。现在该项目已经足够成熟,我们发现控制不够灵活,无法满足我们的要求,并且在某种程度上我们对走 MS 会员资格的道路感到遗憾。如果您有时间正确构建身份验证,则滚动您自己的身份验证将是最佳选择。

        听起来您的应用有点混合,因为您为内部和外部客户提供服务,但也许还考虑为外部客户集成OpenID。有一些很棒的 ASP.NET OpenID 控件可以真正让为外部客户处理新帐户变得轻而易举。这当然取决于您的应用程序的“公开”程度。

        【讨论】:

        • +1 表示 OpenID - 这是一个非常有趣的想法 - 谢谢!
        【解决方案4】:

        Ldap 有人吗?它是免费的、跨平台的、易于远程使用和管理的、具有与其他身份验证方案的桥梁,以及您知道存在的更多语言的绑定...

        【讨论】:

        • 那我们不是和 Active Directory 基本上在同一个地方吗?我们必须在 LDAP 中为 LDAP 中的任何用户(真实或虚拟)创建用户帐户,对吗?与其他选项相比,您认为有什么好处?
        • 另外,据我了解(但如果我错了,请纠正我),LDAP 实际上只处理身份验证部分 - 你是谁?还是有一种简单的方法可以将授权也包含在内? (作为用户你能做什么?)
        • ASP.NET 成员是否也提供了 AD 集成选项?例如,Ldap 允许数据源位于 Novell 或 Linux 系统上,而在这些系统上模拟 AD 将是一项艰巨的工作——即使可能 100% 匹配。
        • LDAP 向 Web 应用程序添加了另一个移动部分,如果您使用 AD LDAP 存储,则通过允许 Web 应用程序添加身份验证凭据,您将公司数据暴露在不必要的风险中可能在 Windows 网络上有效。
        【解决方案5】:

        不是 2003 年的 AZMan 吗?

        我会推荐 1 或 3。就我个人而言,我一直选择 3。1 有很多我不使用或不打算使用的功能。

        【讨论】:

          【解决方案6】:

          我会远离 AzMan。我们曾经走过那条路,不喜欢我们所在的城镇区域。我们总是使用基于 AD 的登录,使用当前用户的 SID 链接到数据库中的用户,然后获取权限从那里。鉴于您的设置,这可能是不可能的(或不实际的),但无论如何我都会远离 AzMan。

          【讨论】:

          • 我们一直在使用 AzMan。一路上遇到了一些问题,但没有什么无法解决的......
          【解决方案7】:

          我不是 ASP 或 .NET 开发人员,但我的直觉告诉我 (3)。您真的不希望公共使用的网络应用程序能够以任何方式访问您的公司网络,更不用说能够将身份验证凭据放在 AD 附近的任何位置。

          【讨论】:

            【解决方案8】:

            您似乎提供了太多且太可扩展而无法坚持一种技术解决方案

            解决方案 3。

            我会围绕一个 User 类构建整个应用程序 您只需对其进行建模,以便它为您提供所需的灵活性和可扩展性

            类似:

                [ClassAttribute ( "Yordan Georgiev", "1.0.2", "20090302", "20090415" , false )]
            public class User
            {
                #region DomainName
                private string _DomainName;
                public string DomainName
                {
                    get { return _DomainName; }
                    set { _DomainName = value; }
                } //eof property DomainName 
            
            
                #endregion DomainName
            
                #region Status
                private int _Status;
                public int Status
                {
                    get { return _Status; }
                    set { _Status = value; }
                } //eof property Status 
            
            
                #endregion Status
            
            #region Password
                private string _Password = Resources.GV.Pass; 
                public string Password
                {
                    get { return _Password; }
                    set {
                        _Password = GenApp.Utils.Security.Encryptor.Encrypt ( value,
                            GenApp.Conf.GenAppSettings.Instance.EncryptionAlgorithm );
                        //debug_Password = value; //unencrypted 
                    }
                } //eof property Password 
            
            
                #endregion Password 
            
            #region ListUserRoles
                    private List<UserRole> _ListUserRoles;
                    public List<UserRole> ListUserRoles { get { return _ListUserRoles; } set     { _ListUserRoles = value; } }
                    #endregion ListUserRoles
            
            
                #region UserSettings
                private GenApp.Conf.UserSettings _UserSettings;
                public GenApp.Conf.UserSettings UserSettings
                {
                    get {
                        if (_UserSettings == null)
                            _UserSettings = (GenApp.Conf.UserSettings)GenApp.Conf.GenAppSettings.Instance;
            
                        return _UserSettings; 
                    }
                    set { _UserSettings = value; }
                } //eof property UserSettings 
            

            }

            【讨论】:

            • 真的吗?是否需要一个全面、完整且希望简单易用的解决方案来了解你是谁以及你可以成为什么?我认为这是这些天几乎 ANY 应用程序的基石,不是吗?
            • 代码只是用户对象应该具有的基本属性的示例......您可以随时随地添加任意数量的...... +创建一些插件模型。我的观点是你必须有你自己的用户类(或者甚至从微软的一些用户类中派生出来,这取决于你为这些用户提供的服务..
            • 这是一个如何从 MembershipUser 类派生的示例 - msdn.microsoft.com/en-us/library/ms366730.aspx
            猜你喜欢
            • 1970-01-01
            • 2013-01-06
            • 2020-10-13
            • 1970-01-01
            • 1970-01-01
            • 2012-09-24
            • 2010-12-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多