我正在开展一个项目,该项目有三种不同的用户类型(管理员,家长和教师)访问网站。用户通过提供凭据并选择其类型来登录,如下图所示
我想为用户提供自定义身份验证和授权。通过使用this教程中的方法,我为每个用户类型扩展了MemberShipProvider类并覆盖了ValidateUser方法,最后得到了三个名为AdminAuthProvider,ParentAuthProvider和TeacherAuthProvider的类。以下是AdminAuthProvider
中ValidateUser方法中的代码public override bool ValidateUser(string username, string password)
{
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
{
return false;
}
using (var db = new pscsEntities())
{
return db.Admins.Any(admin => admin.username.Equals(username) && admin.password.Equals(password));
}
}
其他两个类中ValidateUser的代码是相同的。 我的问题是 - 是否有更好的方法在单个类中进行身份验证,而不是三个扩展相同类的类? - 如何在此方案中提供授权角色? 对于第二个问题,上面的教程建议扩展RoleProvider类并重写其方法。我似乎无法弄清楚如何覆盖GetRolesForUser方法,因为它只需要一个字符串参数,它是当前登录用户的用户名。我在这里有点困惑。 如果有帮助,这里是数据库中三个用户的表格图
答案 0 :(得分:3)
您的解决方案似乎将两个相关但不同的功能混为一谈:身份验证和授权。
身份验证会告诉您该用户是谁。授权通常在身份验证后发生,并告诉您用户可以执行的操作,通常表示为一个或多个角色的列表。在这种传统模型下,您将拥有一个针对所有三种类型用户的表,并且只有一种方法可以对其进行身份验证。经过身份验证后,数据库将告诉您用户具有哪种角色(教师,学生或管理员)。根据角色,网站将公开不同的功能集。
在您的模型下,用户角色的表达将在身份验证过程中完成。实际上,用户自己会告诉您他的角色是身份验证过程的一部分。这是不寻常的设计,并且由于多种原因而易碎。例如,想象一种新类型的用户角色(例如"老师的助手。")鉴于您当前的设计,您必须添加第四个数据库表和域对象管理功能对于新表,以及验证代码的第四个包装类。您的设计还排除了具有多个角色的用户(如果我是管理员和教师,该怎么办?)
我建议您重新访问此设计并允许用户仅提供用户名和密码,并允许系统确定他是学生,教师还是管理员,或者这些是否是这些的组合。使用这种设计,您只需要一个身份验证类,GetRolesForUser就会更有意义。