角色管理与授权机制
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
角色管理和授权机制
理论基础
用户与角色的关系:
一个用户可以拥有多个角色,一个角色也可以赋给多个用户,是 多对多的关系。
角色 a
用户 a
角色 b
用户 b
角色 c
用户 c
角色 d
角色与权限的关系:
角色是权限的集合,一个权限可分属不同的角色,是多对多的关系。
角色 1
权限 a 权限 b 权限 c
权限 e 权限 d
34
移植成员资格数据库
在此选择要保存成员资格信息的数据库。
35
修改网站配置文件web.config
添加一个连接字串
使用指定的连接字串
<connectionStrings> <add name="MySqlConnection" connectionString=“……;" /> </connectionStrings>
27
CreateUserWizard控件
提供一个向导,用于创建用户。
此控件在后台调用MemberShip.CreateUser()来创 建用户
28
有关登录控件
ASP.NET提供的登录控件可与成员资格紧密集成, 大大减少了开发工作量。 如果需要创建自定义风格的页面,可以不用这套现成 的控件,而完全用传统的HTML元素和ASP.NET标 准控件重新打造全新的页面。这时,后台可以直接使 用现成的成员资格与角色管理组件。
2. Admin文件夹只允许属于Admin角色的用户
访问,User文件夹只针对注册用户开放,匿 名用户不允许访问。
3. 网站首页Default.aspx和登录网页Login.aspx
则开放给所有的用户访问。 4. 注意查看每个文件夹下的web.config文件。
18
灵活应用Memu控件和配置文件实现不同角色 的用户看到的导航菜单是不同的
web.config如下:
<forms loginUrl="~/login.aspx" defaultUrl="~/default.aspx" /> </authentication>
<authentication mode="Forms">
先访问登录网页Login.aspx,成功后自动跳转到网 站主页default.aspx
36
配置角色管理提供程序
在Web.Config中添加以下设置参数: <providers> <add name="SqlProvider" connectionStringName="MySqlConnection" applicationName="UserMemberShipInSQLServer" type=" System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a " … />
Forms
由ASP.NET负责进行身份验证,即网站提供一 个登录页面,要求用户输入用户名与密码,验 证合法之后才可以访问网站。
使用微软提供的Passport SDK,通过第三方进行身份 验证。
9
Passport
在实际的Web项目,多采用Forms身份验证。
理解基于Form的ASP.NET身份验证
10
一个问题浮出水面……
在前面的例子中,用户可以通过直接在
浏览器中输入URL来绕开登录过程直接 访问网站主页。
如何强制用户必须登录后才能访问网站
主页?
11
给网站添加访问规则
在待访问的目录中web.config中添加以下设置: <authorization> <allow users="Admin" /> <deny users="*" /> </authorization>
角色 2
权限 f 权限 g 权限 h 权限 i
用户权限配置管理流程
M : N
创建角色 授权于角色
角色
M :Fra Baidu bibliotekN
创建用户
用户
权限管理的数据表设计
用户表
角色表
权限表
用户-角色表
角色-权限表
权限控制粒度
目录级 页面级
粗粒度
控件级
细粒度
1、 Web用户与权限管理概述
Web用户权限管理
1.
Web用户权限管理,简单地说,要解决两个任务: 身份验证(authentication):即确定访问网站 的用户身份,解决“用户是谁”的问题;
42
上述设置禁止匿名用户访问网站,只允许Admin用户访问。
有了上述设置,现在,用户不登录直接访问网站主页,将会被导航到登
录页面。
身份验证确认“你是谁?”,而授权则规定“你能干什么!”,这些可
12
以在web.config中设定身份验证模式和进行授权。
如果我们的用户比较多,那么需要
在配置文件中把这些用户全部罗列 其中。并且以后添加了新用户,还 得继续修改配置,太麻烦了!
<deny users="?" /> <allow roles="系统管理员" /> <deny users="*" />
19
Web.sitemap设计注意事项:
Web.config文件中
securityTrimmingEnabled="true"
URL不能重复 Role属性的使用
20
3 使用登录控件
默认情况下,当用户登录后访问放置了此控件的网页 ,此控件显示“注销”字样,而用户未登录访问此网 页,此控件则显示“登录”字样。具体为哪种状态是
由 Page 对象的 Request 属性的 IsAuthenticated
属性决定的。
26
LoginName控件
默认情况下,LoginName 控件显示 Page 类的 User 属性中包含的名称。 如果User.Identity.Name为空,则不呈现控件。
在实际开发中,往往网站有自己 的数据库,并且希望能保存有关 用户的更多的信息。 好像成员资格与角色管理不能修 改数据库结构,因此有人认为: ASP.NET的成员资格与角色管理 是鸡肋,真的是这样吗?
32
问题1:
能不能将成员资格数据库 并入本网站数据库?
解决方案:
使用 C:\Windows\Microsoft.NET\Framework64\ v4.0.30319的aspnet_regsql工具将成员资 格数据库移到SQL Server中。(举例说明)
<roleManager enabled="true" defaultProvider="SqlProvider">
</providers>
</roleManager>
注意上面的type元素,其值是从“machine.config”文件中获取的。
37
问题2:
能不能添加扩充的用户信息?
解决方案
ASP.NET登录控件简介
可以使用ASP.NET登录控件快速创建网站用户管理 模块
22
Login控件
显示一个用户名与密码文本框,用户输入之后,如果 用户名与密码有效,自动导航到其NavigateUrl指定 的网页,否则,显示出错信息,要求用户重新输入。
当用户登录且成功通过验证,Login控件会触发一个 LoggedIn事件。如果用户的登录尝试不成功,如密 码错误,Login控件会触发一个LoginError事件。
23
LoginView控件
1. 2.
可根据角色在同一个网页中显示不同的模板,默认情 况下只有两个模板。 AnonymousTemplate:用于匿名用户 LoggedInTemplate:用于登录用户
注册用户视图 匿名用户视图
24
ChangePassword控件
不用多说,一目了然。
25
LoginStatus控件
MemberShip类:提供了一系列的静态方法与属性, 完成创建用户、管理密码以及身份验证的功能。 MemberShipUser类:代表单个的用户权限信息, 该对象公开成员资格用户的相关信息(如电子邮件地 址),并为成员资格用户提供功能(如更改或重置其 密码的功能)。 Roles类:提供了一系列的静态方法与属性,完成角 色管理的相关功能,例如,将某个用户加入到特定的 角色中。
通用的做法就是引入
角色的概念。
13
进一步理解授权
可以把用户分为特定的种类,每种类型的用
户只能做特定的事。
这种用户的分类被称为“角色(Role)”。 角色可以看成是具有特定权限的用户集合。 可以使用
“ASP.NET网站配置”工
14
具轻松地给网站添加角色。
2 使用ASP.NET网站管理工具
2.
使用权限(authorization):即在用户身份确定 之后,授予他一定的权限,允许他使用特定的服务, 这是解决“用户能干什么”的问题。
8
ASP.NET身份验证方式
ASP.NET应用程序可以使用以下四种身份验证方式
身份验证方式 None Windows 说明 不进行身份验证,Web站点向所有人开放 基于Windows身份验证,使用用户登录Windows的账 户作为Web站点的用户。由于用户在访问网站前已经 登录了Windows,所以他访问网站时不再需要输入用 户名与密码。
所有的成员资格用户信息都有一个标识
MembershipUser user = Membership.GetUser("sa"); if(user!=null) Response.Write(user.ProviderUserKey);
这个用户标识是一个GUID字串,不可能重复。 方法1:构建用户扩展表 利用此标识,根据实际情况可以在数据库中另外创建一个自定义用户 表以保存一些扩充信息,这个表与成员资格的用户表之间使用此用户 标识进行关联。 方法2:利用Membership表中空闲的多余字段 因此,既可以利用ASP.NET现有的成员资格组件以减少开发工作量, 39 同时又能兼顾实际需要。
1、设计Web.sitemap 2、配置Web.config <!--通过siteMap控制显示的菜单,通过每个目录下的web.config控制访问权限, 达到“不同的角色看到的菜单不同”的效果--> <siteMap defaultProvider="webSiteMap"> <providers> <add name="webSiteMap" type="System.Web.XmlSiteMapProvider" securityTrimmingEnabled="true" siteMapFile="~/Web.sitemap"/> </providers> </siteMap> 3、配置角色目录下的Web.config 放置SitemapDataSource控件 放置Menu控件
29
总结:M e m b e r s h i p 数 据 库 结 构 图
30
4 自定义成员资格与角色管理
问得好
有关“成员资格与角色管理”的看法
默认情况下,成员资格与角色管 理的数据放在网站App_Data文 件夹下的ASPNETDB.MDF中, 定义了相当多的表。
Membership表
User表
40
ASP.NET成员资格与角色管理框架剖析
http://msdn.microsoft.com/zhcn/library/system.web.security.membership(v=vs. 110).aspx
了解ASP.NET用户权限管理框架 System.Web.Security
ASP.NET网站管理工具
从VS2010的“网站”菜单中选择“ASP.NET配 置”,即可打开ASP.NET网站管理工具。
16
使用网站管理工具
利用网站管理工具,可以给网站添加用户和角色,同 时创建访问规则。
17
使用ASP.NET网站配置工具配置网站
1. 使用“ASP.NET网站管理工具”创建了 Admin与User两个角色。
设定网站使用特定的成员资格提供程序:
移除默认的提供程序 使用新的提供程序
<membership defaultProvider="SqlProvider“ > <providers> <clear /> <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MySqlConnection" ……" /> </providers> </membership>
理论基础
用户与角色的关系:
一个用户可以拥有多个角色,一个角色也可以赋给多个用户,是 多对多的关系。
角色 a
用户 a
角色 b
用户 b
角色 c
用户 c
角色 d
角色与权限的关系:
角色是权限的集合,一个权限可分属不同的角色,是多对多的关系。
角色 1
权限 a 权限 b 权限 c
权限 e 权限 d
34
移植成员资格数据库
在此选择要保存成员资格信息的数据库。
35
修改网站配置文件web.config
添加一个连接字串
使用指定的连接字串
<connectionStrings> <add name="MySqlConnection" connectionString=“……;" /> </connectionStrings>
27
CreateUserWizard控件
提供一个向导,用于创建用户。
此控件在后台调用MemberShip.CreateUser()来创 建用户
28
有关登录控件
ASP.NET提供的登录控件可与成员资格紧密集成, 大大减少了开发工作量。 如果需要创建自定义风格的页面,可以不用这套现成 的控件,而完全用传统的HTML元素和ASP.NET标 准控件重新打造全新的页面。这时,后台可以直接使 用现成的成员资格与角色管理组件。
2. Admin文件夹只允许属于Admin角色的用户
访问,User文件夹只针对注册用户开放,匿 名用户不允许访问。
3. 网站首页Default.aspx和登录网页Login.aspx
则开放给所有的用户访问。 4. 注意查看每个文件夹下的web.config文件。
18
灵活应用Memu控件和配置文件实现不同角色 的用户看到的导航菜单是不同的
web.config如下:
<forms loginUrl="~/login.aspx" defaultUrl="~/default.aspx" /> </authentication>
<authentication mode="Forms">
先访问登录网页Login.aspx,成功后自动跳转到网 站主页default.aspx
36
配置角色管理提供程序
在Web.Config中添加以下设置参数: <providers> <add name="SqlProvider" connectionStringName="MySqlConnection" applicationName="UserMemberShipInSQLServer" type=" System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a " … />
Forms
由ASP.NET负责进行身份验证,即网站提供一 个登录页面,要求用户输入用户名与密码,验 证合法之后才可以访问网站。
使用微软提供的Passport SDK,通过第三方进行身份 验证。
9
Passport
在实际的Web项目,多采用Forms身份验证。
理解基于Form的ASP.NET身份验证
10
一个问题浮出水面……
在前面的例子中,用户可以通过直接在
浏览器中输入URL来绕开登录过程直接 访问网站主页。
如何强制用户必须登录后才能访问网站
主页?
11
给网站添加访问规则
在待访问的目录中web.config中添加以下设置: <authorization> <allow users="Admin" /> <deny users="*" /> </authorization>
角色 2
权限 f 权限 g 权限 h 权限 i
用户权限配置管理流程
M : N
创建角色 授权于角色
角色
M :Fra Baidu bibliotekN
创建用户
用户
权限管理的数据表设计
用户表
角色表
权限表
用户-角色表
角色-权限表
权限控制粒度
目录级 页面级
粗粒度
控件级
细粒度
1、 Web用户与权限管理概述
Web用户权限管理
1.
Web用户权限管理,简单地说,要解决两个任务: 身份验证(authentication):即确定访问网站 的用户身份,解决“用户是谁”的问题;
42
上述设置禁止匿名用户访问网站,只允许Admin用户访问。
有了上述设置,现在,用户不登录直接访问网站主页,将会被导航到登
录页面。
身份验证确认“你是谁?”,而授权则规定“你能干什么!”,这些可
12
以在web.config中设定身份验证模式和进行授权。
如果我们的用户比较多,那么需要
在配置文件中把这些用户全部罗列 其中。并且以后添加了新用户,还 得继续修改配置,太麻烦了!
<deny users="?" /> <allow roles="系统管理员" /> <deny users="*" />
19
Web.sitemap设计注意事项:
Web.config文件中
securityTrimmingEnabled="true"
URL不能重复 Role属性的使用
20
3 使用登录控件
默认情况下,当用户登录后访问放置了此控件的网页 ,此控件显示“注销”字样,而用户未登录访问此网 页,此控件则显示“登录”字样。具体为哪种状态是
由 Page 对象的 Request 属性的 IsAuthenticated
属性决定的。
26
LoginName控件
默认情况下,LoginName 控件显示 Page 类的 User 属性中包含的名称。 如果User.Identity.Name为空,则不呈现控件。
在实际开发中,往往网站有自己 的数据库,并且希望能保存有关 用户的更多的信息。 好像成员资格与角色管理不能修 改数据库结构,因此有人认为: ASP.NET的成员资格与角色管理 是鸡肋,真的是这样吗?
32
问题1:
能不能将成员资格数据库 并入本网站数据库?
解决方案:
使用 C:\Windows\Microsoft.NET\Framework64\ v4.0.30319的aspnet_regsql工具将成员资 格数据库移到SQL Server中。(举例说明)
<roleManager enabled="true" defaultProvider="SqlProvider">
</providers>
</roleManager>
注意上面的type元素,其值是从“machine.config”文件中获取的。
37
问题2:
能不能添加扩充的用户信息?
解决方案
ASP.NET登录控件简介
可以使用ASP.NET登录控件快速创建网站用户管理 模块
22
Login控件
显示一个用户名与密码文本框,用户输入之后,如果 用户名与密码有效,自动导航到其NavigateUrl指定 的网页,否则,显示出错信息,要求用户重新输入。
当用户登录且成功通过验证,Login控件会触发一个 LoggedIn事件。如果用户的登录尝试不成功,如密 码错误,Login控件会触发一个LoginError事件。
23
LoginView控件
1. 2.
可根据角色在同一个网页中显示不同的模板,默认情 况下只有两个模板。 AnonymousTemplate:用于匿名用户 LoggedInTemplate:用于登录用户
注册用户视图 匿名用户视图
24
ChangePassword控件
不用多说,一目了然。
25
LoginStatus控件
MemberShip类:提供了一系列的静态方法与属性, 完成创建用户、管理密码以及身份验证的功能。 MemberShipUser类:代表单个的用户权限信息, 该对象公开成员资格用户的相关信息(如电子邮件地 址),并为成员资格用户提供功能(如更改或重置其 密码的功能)。 Roles类:提供了一系列的静态方法与属性,完成角 色管理的相关功能,例如,将某个用户加入到特定的 角色中。
通用的做法就是引入
角色的概念。
13
进一步理解授权
可以把用户分为特定的种类,每种类型的用
户只能做特定的事。
这种用户的分类被称为“角色(Role)”。 角色可以看成是具有特定权限的用户集合。 可以使用
“ASP.NET网站配置”工
14
具轻松地给网站添加角色。
2 使用ASP.NET网站管理工具
2.
使用权限(authorization):即在用户身份确定 之后,授予他一定的权限,允许他使用特定的服务, 这是解决“用户能干什么”的问题。
8
ASP.NET身份验证方式
ASP.NET应用程序可以使用以下四种身份验证方式
身份验证方式 None Windows 说明 不进行身份验证,Web站点向所有人开放 基于Windows身份验证,使用用户登录Windows的账 户作为Web站点的用户。由于用户在访问网站前已经 登录了Windows,所以他访问网站时不再需要输入用 户名与密码。
所有的成员资格用户信息都有一个标识
MembershipUser user = Membership.GetUser("sa"); if(user!=null) Response.Write(user.ProviderUserKey);
这个用户标识是一个GUID字串,不可能重复。 方法1:构建用户扩展表 利用此标识,根据实际情况可以在数据库中另外创建一个自定义用户 表以保存一些扩充信息,这个表与成员资格的用户表之间使用此用户 标识进行关联。 方法2:利用Membership表中空闲的多余字段 因此,既可以利用ASP.NET现有的成员资格组件以减少开发工作量, 39 同时又能兼顾实际需要。
1、设计Web.sitemap 2、配置Web.config <!--通过siteMap控制显示的菜单,通过每个目录下的web.config控制访问权限, 达到“不同的角色看到的菜单不同”的效果--> <siteMap defaultProvider="webSiteMap"> <providers> <add name="webSiteMap" type="System.Web.XmlSiteMapProvider" securityTrimmingEnabled="true" siteMapFile="~/Web.sitemap"/> </providers> </siteMap> 3、配置角色目录下的Web.config 放置SitemapDataSource控件 放置Menu控件
29
总结:M e m b e r s h i p 数 据 库 结 构 图
30
4 自定义成员资格与角色管理
问得好
有关“成员资格与角色管理”的看法
默认情况下,成员资格与角色管 理的数据放在网站App_Data文 件夹下的ASPNETDB.MDF中, 定义了相当多的表。
Membership表
User表
40
ASP.NET成员资格与角色管理框架剖析
http://msdn.microsoft.com/zhcn/library/system.web.security.membership(v=vs. 110).aspx
了解ASP.NET用户权限管理框架 System.Web.Security
ASP.NET网站管理工具
从VS2010的“网站”菜单中选择“ASP.NET配 置”,即可打开ASP.NET网站管理工具。
16
使用网站管理工具
利用网站管理工具,可以给网站添加用户和角色,同 时创建访问规则。
17
使用ASP.NET网站配置工具配置网站
1. 使用“ASP.NET网站管理工具”创建了 Admin与User两个角色。
设定网站使用特定的成员资格提供程序:
移除默认的提供程序 使用新的提供程序
<membership defaultProvider="SqlProvider“ > <providers> <clear /> <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MySqlConnection" ……" /> </providers> </membership>