asp.net mvc 中不同用户类型的自定义身份验证和授权
Custom Authentication and Authorization for different user types in asp.net mvc
我正在做一个项目,其中有三种不同的用户类型(管理员、家长和教师)访问该网站。用户通过提供他们的凭据并选择他们的类型来登录,如下图所示
我想为用户提供自定义身份验证和授权。通过使用 this 教程中的方法,我为每种用户类型扩展了 MemberShipProvider class 并覆盖了 ValidateUser 方法,并最终得到了三个 class,名为 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));
}
}
另外两个class中ValidateUser的代码是一样的。
我的问题是
- 是否有更好的方法在单个 class 中进行身份验证,而不是在扩展相同 classes 的三个 classes 中进行身份验证?
- 在这种情况下如何提供授权角色?
对于第二个问题,上述教程建议扩展 RoleProvider class 并覆盖其方法。我似乎无法弄清楚如何覆盖 GetRolesForUser 方法,因为它只需要一个字符串参数,即当前登录用户的用户名。我在这里有点困惑。
如果有帮助,这里是数据库中三个用户的 table 图
您的解决方案似乎混淆了两个相关但不同的功能:身份验证和授权。
身份验证告诉您用户是谁。授权通常发生在身份验证之后,并告诉您用户可以做什么,通常表示为一个或多个角色的列表。在这种传统模型下,对于所有三种类型的用户,您只有一个 table,并且只有一种方法可以对他们进行身份验证。一旦通过身份验证,数据库将告诉您用户具有何种角色(教师、学生或管理员)。根据角色,网站将公开不同的功能集。
在您的模型下,用户角色的表达在身份验证过程中结束。实际上,作为身份验证过程的一部分,用户本人会告诉您他的角色。这是不寻常的设计,并且由于多种原因而变得脆弱。例如,想象一种新型用户角色(例如 "teacher's assistant.")鉴于您当前的设计,您必须为新的 table 添加第四个 DB table 和域对象管理功能,以及身份验证代码的第四个包装器 class。您的设计还排除了具有多个角色的用户(如果我既是管理员又是教师怎么办?)
我建议您重新审视此设计并允许用户仅提供用户名和密码,并允许系统确定他是学生、教师还是管理员,或这些的某种组合。使用这种设计,您只需要一次身份验证 class,而 GetRolesForUser 会更有意义。
我正在做一个项目,其中有三种不同的用户类型(管理员、家长和教师)访问该网站。用户通过提供他们的凭据并选择他们的类型来登录,如下图所示
我想为用户提供自定义身份验证和授权。通过使用 this 教程中的方法,我为每种用户类型扩展了 MemberShipProvider class 并覆盖了 ValidateUser 方法,并最终得到了三个 class,名为 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));
}
}
另外两个class中ValidateUser的代码是一样的。
我的问题是
- 是否有更好的方法在单个 class 中进行身份验证,而不是在扩展相同 classes 的三个 classes 中进行身份验证?
- 在这种情况下如何提供授权角色?
对于第二个问题,上述教程建议扩展 RoleProvider class 并覆盖其方法。我似乎无法弄清楚如何覆盖 GetRolesForUser 方法,因为它只需要一个字符串参数,即当前登录用户的用户名。我在这里有点困惑。
如果有帮助,这里是数据库中三个用户的 table 图
您的解决方案似乎混淆了两个相关但不同的功能:身份验证和授权。
身份验证告诉您用户是谁。授权通常发生在身份验证之后,并告诉您用户可以做什么,通常表示为一个或多个角色的列表。在这种传统模型下,对于所有三种类型的用户,您只有一个 table,并且只有一种方法可以对他们进行身份验证。一旦通过身份验证,数据库将告诉您用户具有何种角色(教师、学生或管理员)。根据角色,网站将公开不同的功能集。
在您的模型下,用户角色的表达在身份验证过程中结束。实际上,作为身份验证过程的一部分,用户本人会告诉您他的角色。这是不寻常的设计,并且由于多种原因而变得脆弱。例如,想象一种新型用户角色(例如 "teacher's assistant.")鉴于您当前的设计,您必须为新的 table 添加第四个 DB table 和域对象管理功能,以及身份验证代码的第四个包装器 class。您的设计还排除了具有多个角色的用户(如果我既是管理员又是教师怎么办?)
我建议您重新审视此设计并允许用户仅提供用户名和密码,并允许系统确定他是学生、教师还是管理员,或这些的某种组合。使用这种设计,您只需要一次身份验证 class,而 GetRolesForUser 会更有意义。