自定义.net MembershipProvider中的自定义ValidateUser()

时间:2011-04-28 18:10:54

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

有没有办法扩展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链接登录的客户,安全的ey! :)

由于

3 个答案:

答案 0 :(得分:3)

如果您正在为登录页面编写代码,那么您可以直接引用自定义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);
        }
    }

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

答案 1 :(得分:1)

如何只传递Guid的字符串表示并转换?

public override bool ValidateUser(string username, string password)
{
    Guid rsid;

    if (Guid.TryParse(username, out rsid))
    {
        return db.ValidateUser(rsid);
    }
    else
    {
        return false;
    }
}

答案 2 :(得分:0)

另一种方法是在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");

但它仍然感到hacky。只是添加新的公共方法不会导致显示该方法的默认Membership类,并且我不知道是否可以将其更改为执行此操作。

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