有没有办法扩展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! :)
由于
答案 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类,并且我不知道是否可以将其更改为执行此操作。
至少您不必以这种方式滥用数据类型,并且具有针对特定情况的方法。