Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
asp.net mvc中不同用户类型的自定义身份验证和授权_Asp.net_Asp.net Mvc_Authentication_Authorization - Fatal编程技术网

asp.net mvc中不同用户类型的自定义身份验证和授权

asp.net mvc中不同用户类型的自定义身份验证和授权,asp.net,asp.net-mvc,authentication,authorization,Asp.net,Asp.net Mvc,Authentication,Authorization,我正在做一个项目,有三种不同的用户类型(管理员、家长和教师)访问该网站。用户通过提供其凭据并选择其类型登录,如下图所示 我想为用户提供自定义身份验证和授权。通过使用本教程中的方法,我为每种用户类型扩展了MemberShipProvider类,并重写了ValidateUser方法,最后得到了三个名为AdminAuthProvider、ParentAuthProvider和TeacherAuthProvider的类。以下是AdminAuthProvider中ValidateUser方法中的代码 p

我正在做一个项目,有三种不同的用户类型(管理员、家长和教师)访问该网站。用户通过提供其凭据并选择其类型登录,如下图所示

我想为用户提供自定义身份验证和授权。通过使用本教程中的方法,我为每种用户类型扩展了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方法,因为它只接受一个字符串参数,即当前登录用户的用户名。我有点困惑。 如果有帮助的话,这里是数据库中三个用户的图表

您的解决方案似乎融合了两个相关但截然不同的功能:身份验证和授权

身份验证告诉您用户是谁。授权通常发生在身份验证之后,并告诉您用户可以做什么,通常表示为一个或多个角色的列表。在这种传统模式下,您将为所有三种类型的用户提供一个表,并且只有一种对他们进行身份验证的方法。经过身份验证后,数据库将告诉您用户具有何种角色(教师、学生或管理员)。根据角色,网站将公开不同的功能集

在您的模型下,用户角色的表达式在身份验证过程中结束。实际上,用户自己会告诉您他的角色是身份验证过程的一部分。这是一种不同寻常的设计,由于多种原因,它很脆。例如,设想一种新类型的用户角色(例如“教师助手”),根据您当前的设计,您必须为新表添加第四个DB表和域对象管理函数,以及为身份验证代码添加第四个包装类。您的设计还排除了具有多个角色的用户(如果我既是管理员又是教师怎么办?)


我建议您重新考虑这个设计,允许用户只提供用户名和密码,并允许系统确定他是学生、教师还是管理员,或者是这些的组合。使用这种设计,您只需要一个身份验证类,GetRolesForUser将更有意义。

您的解决方案似乎将两个相关但不同的功能合并在一起:身份验证和授权

身份验证告诉您用户是谁。授权通常发生在身份验证之后,并告诉您用户可以做什么,通常表示为一个或多个角色的列表。在这种传统模式下,您将为所有三种类型的用户提供一个表,并且只有一种对他们进行身份验证的方法。经过身份验证后,数据库将告诉您用户具有何种角色(教师、学生或管理员)。根据角色,网站将公开不同的功能集

在您的模型下,用户角色的表达式在身份验证过程中结束。实际上,用户自己会告诉您他的角色是身份验证过程的一部分。这是一种不同寻常的设计,由于多种原因,它很脆。例如,设想一种新类型的用户角色(例如“教师助手”),根据您当前的设计,您必须为新表添加第四个DB表和域对象管理函数,以及为身份验证代码添加第四个包装类。您的设计还排除了具有多个角色的用户(如果我既是管理员又是教师怎么办?)


我建议您重新考虑这个设计,允许用户只提供用户名和密码,并允许系统确定他是学生、教师还是管理员,或者是这些的组合。使用这种设计,您只需要一个身份验证类,GetRolesForUser将更有意义。

您的解决方案似乎将两个相关但不同的功能合并在一起:身份验证和授权

身份验证告诉您用户是谁。授权通常发生在身份验证之后,并告诉您用户可以做什么,通常表示为一个或多个角色的列表。在这种传统模式下,您将为所有三种类型的用户提供一个表,并且只有一种对他们进行身份验证的方法。经过身份验证后,数据库将告诉您用户具有何种角色(教师、学生或管理员)。根据角色,网站将公开不同的功能集

在您的模型下,用户角色的表达式在身份验证过程中结束。实际上,用户自己会告诉您他的角色是身份验证过程的一部分。这是一种不同寻常的设计,由于多种原因,它很脆。例如,设想一种新类型的用户角色(例如“教师助手”),根据您当前的设计,您必须为新表添加第四个DB表和域对象管理函数,以及为身份验证代码添加第四个包装类。您的设计还排除了具有多个角色的用户(如果我既是管理员又是教师怎么办?)

我建议您重新考虑这个设计,允许用户只提供用户名和密码,并允许系统确定他是学生、教师还是管理员,或者是这些的组合。使用这种设计,您只需要一个身份验证类和GetRolesForUser