【问题标题】:Custom ValidateUser() in custom .net MembershipProvider自定义 .net MembershipProvider 中的自定义 ValidateUser()
【发布时间】:2011-08-14 22:53:06
【问题描述】:

有没有办法扩展 ValidateUser 方法以接收除默认参数之外的其他参数?

默认

public override bool ValidateUser(string username, string password)
{
    return db.ValidateUser(username, password);
}

我想实现

public bool ValidateUser(Guid rsid)
{
    return db.ValidateUser(rsid);
}

'db' 是一个包含与数据库通信的方法的类。无论如何,这不是我的设计,而是希望能够使用 Guid 链接登录的客户,放心! :)

谢谢

【问题讨论】:

  • 添加后会发生什么?它看起来对我来说完全有效......
  • 我无法访问该方法,因为它(我认为)在 System.Web.Security.MembershipProvider 类中是不允许的
  • 啊,我以为您可能正在编写一个包装类,并且您可能可以提供自己的方法?

标签: c# asp.net-membership membership-provider


【解决方案1】:

另一种解决方法是在 MembershipProvider 中添加一个新方法(在定义的接口之外),例如:

public class CustomMembershipProvider : MembershipProvider {

    private LoginValidationType ValidationType;

    // new method
    public bool ValidateUser(string username, string password, LoginValidationType validationType = LoginValidationType.WebsiteSpecific) {
        ValidationType = validationType;
        return ValidateUser(username, password);
    }

    // the original method
    public override bool ValidateUser(string username, string password) {
        // do stuff with username, password and this.ValidationType
    }

您现在可以在调用代码中执行以下操作:

        CustomMembershipProvider provider = new CustomMembershipProvider();
        // original method
        provider.ValidateUser("un", "pass"); 
        // or call our new overload
        provider.ValidateUser("un", "pass", LoginValidationType.WebsiteSpecific); 

代替:

        Membership.ValidateUser("un", "pass");

但它仍然感觉很老套。只是添加新的公共方法不会导致默认的 Membership 类显示该方法,我不知道是否可以将其更改为这样做。

至少你不必以这种方式滥用数据类型,并且有针对特定情况的方法。

【讨论】:

    【解决方案2】:

    如果您正在为登录页面编写代码,那么您可以直接引用自定义 MembershipProvider 方法并点击您想要的任何重载,但如果您正在通过抽象类,那么您将无法访问重载。

    至于 Guid 登录,请将 Guid 设为用户名,将密码设置为 null 并执行以下操作:

        public override bool ValidateUser(string username, string password)
        {
            Guid parsedUsername;
            if (String.IsNullOrWhiteSpace(password) && Guid.TryParse(username, out parsedUsername))
            {
                return ValidateUser(parsedUsername);
            }
            else
            {
                return db.ValidateUser(username, password);
            }
        }
    

    它最终成为一个完整的 hack,但实现了您的客户的目标。可能想提醒他们,guid 链接中的安全性为零。

    【讨论】:

      【解决方案3】:

      只传递一个 Guid 的字符串表示形式并进行转换怎么样?

      public override bool ValidateUser(string username, string password)
      {
          Guid rsid;
      
          if (Guid.TryParse(username, out rsid))
          {
              return db.ValidateUser(rsid);
          }
          else
          {
              return false;
          }
      }
      

      【讨论】:

      • 我想到了类似的东西。我试试看
      • 它有效,但不是一个很好的解决方案来滥用数据类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多