Enterprise Library 2.0 Hands On Lab 翻譯(12):安全應(yīng)用程序塊(一)
練習(xí)1:應(yīng)用程序安全性
通過該練習(xí)將在一個已經(jīng)存在的應(yīng)用程序中添加認(rèn)證和基于角色的授權(quán)。
第一步
打BugSmak.sln項目,默認(rèn)的安裝路徑應(yīng)該為C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Security\exercises\ex01\begin,并編譯。
第二步 在應(yīng)用程序中添加認(rèn)證
1.選擇Debug | Start Without Debugging菜單命令運行應(yīng)用程序。應(yīng)用程序當(dāng)前沒有可以使用的認(rèn)證用戶。
2.關(guān)閉應(yīng)用程序。
3.在解決方案管理器中選擇Security \ SecurityHelper.cs文件,選擇View | Code菜單命令,添加如下的命名空間。
using System.Web.Security;
4.在方法Authenticate中添加如下代碼。
public static bool Authenticate(string username, string password)
{
bool authenticated = false;

// TODO: Authenticate Credentials
authenticated = Membership.ValidateUser(username, password);

// TODO: Get Roles
return authenticated;
}方法Authenticate將會被窗體LoginForm調(diào)用來驗證用戶身份,Membership.ValidateUser方法實現(xiàn)了用戶的驗證。Membership系統(tǒng)使用了provider模型,所以應(yīng)用程序不用去實現(xiàn)數(shù)據(jù)的存儲,ASP.NET ships提供了兩種Membership Provider,一是使用Microsoft SQL Server作為數(shù)據(jù)源,另一個是使用Windows Active Directory。也可以創(chuàng)建自己的Membership Provider,我們已經(jīng)實現(xiàn)了讀取從XML文件中讀取application members。
5.在解決方案管理器中選擇Security | Providers | ReadOnlyXmlMembershipProvider.cs,并選擇View | Code菜單命令回顧一下代碼。
ReadOnlyXmlMembershipProvider(繼承于MembershipProvider)是一個自定義Provider的示例,它實現(xiàn)從一個未加密的XML文件中讀取,這并不是一個好的實踐,但是在該練習(xí)中卻非常的有用。
6.打開App.config文件,查看membership provider的配置,認(rèn)證數(shù)據(jù)的存儲定義在一個Users.xml的文件中。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<membership defaultProvider="ReadOnlyXmlMembershipProvider">
<providers>
<add name="ReadOnlyXmlMembershipProvider"
type="BugSmak.Security.Providers.ReadOnlyXmlMembershipProvider, BugSmak"
description="Read-only XML membership provider"
xmlFileName="Users.xml" />
</providers>
</membership>
<roleManager enabled="true"
defaultProvider="ReadOnlyXmlRoleProvider">
<providers>
<add name="ReadOnlyXmlRoleProvider"
type="BugSmak.Security.Providers.ReadOnlyXmlRoleProvider, BugSmak"
description="Read-only XML role provider"
xmlFileName="Users.xml" />
</providers>
</roleManager>
</system.web>
</configuration>如果有一個自定義的Provider,必須對應(yīng)用程序進(jìn)行配置。
7.打開Users.xml文件,可以看到定義了如下用戶。
|
Username |
Password |
Role(s) |
|
Tom |
P@ssw0rd |
Employee |
|
Dick |
P@ssw0rd |
Developer |
|
Harry |
P@ssw0rd |
Manager |
其中代碼:
<?xml version="1.0" encoding="utf-8" ?>
<Users>
<User>
<UserName>Tom</UserName>
<Password>P@ssw0rd</Password>
<EMail>tom@contoso.com</EMail>
<Roles>Employee</Roles>
</User>
<User>
<UserName>Dick</UserName>
<Password>P@ssw0rd</Password>
<EMail>dick@contoso.com</EMail>
<Roles>Developer</Roles>
</User>
<User>
<UserName>Harry</UserName>
<Password>P@ssw0rd</Password>
<EMail>harry@contoso.com</EMail>
<Roles>Manager</Roles>
</User>
</Users>8.選擇Debug | Start Without Debugging運行應(yīng)用程序,用Tom, Dick或者Harry正確的用戶登錄設(shè)置Membership Provider。選擇File | Sign Out退出,以一個錯誤的用戶名和密碼登錄。

9.以用戶名Tom登錄,選擇Tasks | Raise New Bug菜單命令,將會給出一個提示信息“Sorry, you aren't allowed to access that form”。類似的嘗試一下Assign Bug和Resolve Bug。
10.關(guān)閉應(yīng)用程序。
第三步 添加基于角色的授權(quán)
1.在解決方案管理器中選擇TaskForms \ RaiseBug.cs文件,選擇View | Code菜單命令,RaiseBug窗體不管用戶是Employee,Developer還是Manager都允許訪問,如果用戶嘗試訪問沒有權(quán)限的窗體,將會拋出一個SecurityException異常。角色與窗體之間的對應(yīng)權(quán)限如下:
|
TaskForm |
Role Required |
|
RaiseBug |
Employee, Developer, or Manager |
|
AssignBug |
Manager |
|
ResolveBug |
Developer or Manager |
2.在解決方案管理中選擇Security \ SecurityHelper.cs,單擊View | Code菜單命令,
修改方法Authenticate的代碼如下。
public static bool Authenticate(string username, string password)
{
bool authenticated = false;
// TODO: Authenticate Credentials
authenticated = Membership.ValidateUser(username, password);
// TODO: Get Roles
if (!authenticated)
return false;
IIdentity identity;
identity = new GenericIdentity(username, Membership.Provider.Name);
string[] roles = Roles.GetRolesForUser(identity.Name);
IPrincipal principal = new GenericPrincipal(identity, roles);

// Place user's principal on the thread
Thread.CurrentPrincipal = principal;
return authenticated;
}

3.打開App.config文件,查看角色的配置,數(shù)據(jù)存儲在一個Users.xml的文件中。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<membership defaultProvider="ReadOnlyXmlMembershipProvider">
<providers>
<add name="ReadOnlyXmlMembershipProvider"
type="BugSmak.Security.Providers.ReadOnlyXmlMembershipProvider, BugSmak"
description="Read-only XML membership provider"
xmlFileName="Users.xml" />
</providers>
</membership>
<roleManager enabled="true"
defaultProvider="ReadOnlyXmlRoleProvider">
<providers>
<add name="ReadOnlyXmlRoleProvider"
type="BugSmak.Security.Providers.ReadOnlyXmlRoleProvider, BugSmak"
description="Read-only XML role provider"
xmlFileName="Users.xml" />
</providers>
</roleManager>
</system.web>
</configuration>4.選擇Debug | Start Without Debugging運行應(yīng)用程序,分別用Tom, Dick 和 Harry用戶登錄,他們的訪問權(quán)限如下:
|
User |
Task Access |
|
Tom (Employee) |
Raise New Bug |
|
Dick (Developer) |
Raise New Bug Resolve Bug |
|
Harry (Manager) |
Raise New Bug Resolve Bug Assign Bug |
5.關(guān)閉應(yīng)用程序。
更多Enterprise Library的文章請參考《Enterprise Library系列文章》
Worktile,新一代簡單好用、體驗極致的團(tuán)隊協(xié)同、項目管理工具,讓你和你的團(tuán)隊隨時隨地一起工作。完全免費,現(xiàn)在就去了解一下吧。
https://worktile.com



浙公網(wǎng)安備 33010602011771號