代码之家  ›  专栏  ›  技术社区  ›  fletcher

如何使ActiveDirectoryMembershipProvider接受空密码?

  •  0
  • fletcher  · 技术社区  · 14 年前

    我们正在开发一个web应用程序,它使用窗体身份验证和ActiveDirectoryMembershipProvider根据ActiveDirectory对用户进行身份验证。我们很快发现提供程序不允许指定空/空密码,即使这在Active Directory中是完全合法的(前提是没有预防性的密码策略)。

    private void CheckPassword(string password, int maxSize, string paramName)
    {
        if (password == null)
        {
            throw new ArgumentNullException(paramName);
        }
        if (password.Trim().Length < 1)
        {
            throw new ArgumentException(SR.GetString("Parameter_can_not_be_empty", new object[] { paramName }), paramName);
        }
        if ((maxSize > 0) && (password.Length > maxSize))
        {
            throw new ArgumentException(SR.GetString("Parameter_too_long", new object[] { paramName, maxSize.ToString(CultureInfo.InvariantCulture) }), paramName);
        }
    }
    

    除了编写我们自己的自定义提供程序之外,有没有任何方法可以使用.NET的魔力覆盖此功能?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Coding Flow    14 年前

    我不认为在不创建派生类和覆盖所有调用私有CheckPassword方法的方法的情况下可以改变这种行为。我不推荐这个选项,但是,我会建议您审查您的设计,并质疑它是否适合在您的应用程序中允许空白密码。虽然它们在广告中是有效的,但这在实践中是不常见的,它确实会影响windows网络中的其他事情,例如,我认为网络文件共享的默认设置不允许任何密码为空的用户连接到共享。

        2
  •  0
  •   dan richardson    14 年前

    你也许可以考虑使用模拟,但我不知道你是否会有同样的问题。如果是授权用户,那么可以使用模拟来尝试“模拟”计算机上的用户。我不知道这是否有帮助,但前几周我做了类似的事情。如果有任何帮助,请在下面输入代码:)

    using System;  
    using System.Runtime.InteropServices;  
    
    public partial class Test_Index : System.Web.UI.Page {  
    protected void Page_Load(object sender, EventArgs e)
    {        
        IntPtr ptr = IntPtr.Zero;
        if (LogonUser("USERNAME", "", "LEAVE-THIS-BLANK", LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, ref ptr))
        {
            using (System.Security.Principal.WindowsImpersonationContext context = new System.Security.Principal.WindowsIdentity(ptr).Impersonate())
            {
                try
                {
                    // Do do something
                }
                catch (UnauthorizedAccessException ex)
                {
                    // failed to do something
                }
    
                // un-impersonate user out
                context.Undo();
            }
        }
        else
        {
            Response.Write("login fail");
        }
    }
    
    #region imports
    
    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
    
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool CloseHandle(IntPtr handle);
    
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public extern static bool DuplicateToken(IntPtr existingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr duplicateTokenHandle);
    
    #endregion
    
    #region logon consts
    
    // logon types 
    const int LOGON32_LOGON_INTERACTIVE = 2;
    const int LOGON32_LOGON_NETWORK = 3;
    const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
    
    // logon providers 
    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int LOGON32_PROVIDER_WINNT50 = 3;
    const int LOGON32_PROVIDER_WINNT40 = 2;
    const int LOGON32_PROVIDER_WINNT35 = 1;
    #endregion  }