国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET 2.0中保證應用程序的安全

2024-07-10 13:08:57
字體:
來源:轉載
供稿:網友


  成員和角色管理器提供程序--現在asp.net 2.0包含了內建的成員和角色管理服務。由于這些服務都是提供程序驅動的(provider-driven),你可以輕易地變更它,或者用自定義實現來代替它。

  登錄控件--新的登錄控件為站點的基于認證和授權的ui(例如登錄窗體、創建用戶窗體、密碼取回、已登錄用戶或角色的定制ui)提供了基本模塊。這些控件利用asp.net 2.0中的內建的成員和角色服務與站點所定義的用戶和角色信息交互操作。

  大多數web應用程序的一個重要的部分是辨別用戶并控制資源的訪問權。檢測請求的實體(entity)身份的操作就是認證(authentication)。通常,為了進行認證,用戶必須提供憑證,例如帳號/密碼。一旦認證過的身份是有效的,就必須檢測該身份是否能夠訪問指定的資源,這個過程就是授權(authorization)。asp.net與iis一起為應用程序提供認證和授權服務。

  com對象的一個重要特性就是,它能夠控制那些運行com對象代碼的身份。當com對象用請求的實體身份運行代碼的時候,就稱為模仿(impersonation)。asp.net框架組件應用程序可以選擇模仿請求。

  有些應用程序還希望根據請求的身份或者根據請求的身份所屬的角色來動態地定制內容。asp.net框架組件應用程序可以動態地檢測當前請求的身份是否屬于某種角色。例如,應用程序可能希望檢測當前用戶是否屬于管理員角色,以便為管理員有條件地生成內容。

  asp.net 2.0的成員特性使你創建和管理用戶更加容易了。成員特性一般與另外一個叫做角色管理器的新特性一起運作。角色管理器為創建角色和給角色指定用戶提供了下層結構。當成員、角色管理器特性和窗體認證一起工作的時候,asp.net 2.0就可以為創建、認證和授權用戶提供端對端的支持。

  成員和角色管理器都是用基于提供程序的模型設計的。提供程序從特性所暴露的類和業務邏輯中提取特性的物理數據存儲。成員和角色管理器特性都帶有microsoft sql server提供程序。成員特性還帶有一個用于處理活動目錄和活動目錄應用程序模式(adam)的提供程序。角色管理器特性帶有一個能利用windows server 2003授權管理特性的提供程序。你可以建立自定義的提供程序,并配置它與成員和角色管理器特性一起使用。使用自定義提供程序的時候,利用成員和角色管理器特性的頁面仍然會繼續工作,毫無改變。

  登錄控件是一組自定義的服務器控件,它為認證和授權事務提供了公用的用戶界面。登錄控件利用了成員、角色管理器和窗體認證特性中的功能。

  認證和授權

  asp.net與iis一起支持使用基本的、digest和windows認證。asp.net支持微軟passport認證服務,它支持單點登錄服務和用戶配置服務。asp.net還支持一種使用基于窗體認證的強大的服務。基于窗體的認證使用cookie來認證用戶,并允許應用程序執行自己的憑證驗證過程。
我們要認識到,asp.net認證服務是受到iis提供的認證服務制約的。例如,為了在iis應用程序中使用基本認證,你就必須使用internet服務管理工具來配置應用程序以使用基本認證。

  asp.net提供了兩種授權服務:

  · 檢查acl(訪問控制列表)或資源權限,看某個認證過的用戶是否能夠訪問該資源。

  · url授權,它批準一個身份使用一定的web空間。

  為了演示它們的差別,我們來看一個例子,假設某個應用程序允許匿名用戶使用iusr_mymachine帳號訪問。當某個asp.net頁面(例如"/default.aspx")的請求通過認證之后,就會依據該文件(例如"c:/inetpub/wwwroot/default.aspx")的acl進行檢查,看iusr_mymachine帳號是否有權限讀取這個文件。如果有權限,就對訪問進行授權。如果web內容位于ntfs卷中,并且已經配置了虛擬目錄使用windows認證,文件的授權就會自動地執行。

  對于url授權來說,會依據asp.net應用程序的配置數據來進行檢查。如果允許訪問被請求的url,請求就獲得授權了。在例子中,asp.net檢查匿名用戶是否有訪問/default.aspx的權限(也就是說,檢查過程是依據url本身的,沒有依據url最終解析成的文件)。

  這種差別看起來很細微,但是它讓應用程序能夠使用類似基于窗體的認證或passport認證,在這些認證模式中用戶不需要與計算機或域帳號相對應。它還允許你進行虛擬資源的授權(在資源下方并沒有物理文件)。例如,應用程序可以把所有對.stk文件的請求映射給一個處理程序,它根據查詢字符串中的變量來進行證券報價。在這種情況下,沒有物理的.stk文件可供acl檢查,因此使用url授權來控制虛擬資源的訪問權。

  文件授權通常依賴iis提供的通過認證的帳號來執行。如果允許匿名訪問,它就是配置的匿名帳號。否則,就是nt帳號。它的工作方式跟asp是一樣的。

  在資源管理器屬性頁面的"安全"選項卡中可以設置文件或目錄的acl(訪問控制列表)。url授權被配置為asp.net框架組件應用程序的一部分,在"授權用戶和角色"部分有完整的講解。

  為了激活asp.net的認證服務,你必須在應用程序的配置文件中配置<authentication>元素。這個元素可以包含下表列舉的任何值。

描述
none沒有激活的asp.net認證服務。請注意iis認證服務仍然存在。
windowsasp.net認證服務給當前請求附加上windowsprincipal (system.security.principal.windowsprincipal),以保證根據nt用戶或組進行授權。
formsasp.net認證服務管理cookie并把未認證的用戶重定向到登錄頁面。它通常在iis允許匿名訪問應用程序的時候使用。
passportasp.net認證服務提供了passport sdk (你必須安裝)的一個方便的包裝。

  例如,下面的配置文件允許應用程序使用基于窗體(cookie)的認證:

<configuration>
<system.web>
<authentication mode="forms"/>
</system.web>
</configuration>

  使用登錄控件

  下面的例子演示了在應用程序中如何使用登錄控件。

  創建和登錄用戶

  在例子中我們會看到站點的主頁,它包含了一個loginstatus控件,該控件提示用戶登錄站點。這個頁面上的loginstatus控件檢查用戶當前是否通過了認證,并向用戶顯示一個登錄鏈接。用戶點擊這個鏈接就可以看到默認的login.aspx頁面,在web.config中已經把這個頁面配置為窗體認證。login控件顯示在login.aspx頁面上(請注意,在默認的登錄頁面上登錄控件的visiblewhenloggedin屬性會被忽略)。在例子中,登錄控件設置了額外的屬性,顯示了"創建用戶"鏈接,點擊這個鏈接會訪問另外一個頁面,那個頁面使用了createuserwizard控件。在默認情況下,createuserwizard控件包含兩個步驟,在第一步中用戶輸入必要的信息,當他們點擊"創建用戶"按鈕的時候,控件把這些信息傳遞給成員api。如果成員api不能建立該用戶,在控件中會顯示適當的錯誤信息;如果用戶創建成功,控件就載入向導的第二步。在例子中,continuedestinationpageurl屬性被設置為在用戶創建成功之后返回主頁。在默認情況下,當用戶被成功創建之后,createuserwizard會認證并登錄用戶。當用戶返回到主頁的時候,他們會注意到loginstatus被刪除了,他們已經通過了認證,并顯示了一個登出鏈接。點擊登錄鏈接會引起用戶認證票據(ticket)被清除,并顯示登錄鏈接。這時用戶可以點擊登錄鏈接,由于他們已經創建了用戶帳號,所以可以在login.aspx上輸入用戶名和密碼來登錄網站。你可能注意到login控件顯示了一個"記住帳號(remember me)"檢查框。選中這個框并成功登錄之后,會向用戶的計算機上寫入一個cookie,該cookie默認的存續期是50年。你可以通過把login控件的displayrememberme和remembermeset屬性設置為false來禁用這個選項。查看示例的代碼,你可以發現這項事務并沒有任何代碼,只設置了少許的幾個屬性。這些控件的樣式屬性都是站點應用的樣式表設置的。

login.aspx
<%@ page language="vb" masterpagefile="~/site.master"%>
<asp:content id="content1" contentplaceholderid="mainbody" runat="server">
<asp:login id="login1" runat="server" createuserurl="createuser.aspx" createusertext="create a new account" />
</asp:content>

createuser.aspx
<%@ page language="vb" masterpagefile="~/site.master"%>
<asp:content id="content1" contentplaceholderid="mainbody" runat="server">
<asp:createuserwizard id="createuserwizard1" runat="server" continuedestinationpageurl="home.aspx"/><br />
<a href="home.aspx">return to default home page</a><br />
<a href="homeloginview.aspx">return to loginview home page</a><br />
<a href="homechangepassword.aspx">return to changepassword home page</a><br />
</asp:content>

  向認證用戶顯示不同的內容

  下面的例子演示了使用loginview控件為認證過的用戶和匿名用戶顯示不同的內容。盡管例子中沒有顯示什么,但是loginview控件支持基于用戶角色來顯示不同內容。loginview控件中的anonymoustemplate模板包含了一個登錄控件,loggedintemplate模板包含了loginname控件。loginname控件利用格式化字符串屬性來顯示歡迎和用戶姓名。請使用上一個例子中創建的帳號或重新創建一個帳號來登錄站點,并點擊頁面上方的登出鏈接。

<%@ page language="vb" masterpagefile="~/site.master"%>

<asp:content id="content1" contentplaceholderid="mainbody" runat="server">
<asp:loginview id="loginview1" runat="server">
<loggedintemplate>
<h1>
<asp:loginname id="loginname1" runat="server" formatstring="welcome {0}" />
</h1>
</loggedintemplate>
<anonymoustemplate>
<h1>welcome to login controls</h1>
<asp:login id="login1" runat="server" createuserurl="createuser.aspx" createusertext="create a new account" />
</anonymoustemplate>
</asp:loginview>
</asp:content>

  修改密碼

  在默認情況下,changepassword控件要求用戶通過了站點的認證才能更改他們的密碼。但是,在下面的例子中,我們把displayusername屬性設置為真,其結果是用戶在改變自己的密碼之前,可以由changepassword控件進行認證,或者通過站點認證的用戶輸入不同的帳號來改變密碼。例子還鏈接到了創建用戶頁面,使你能夠創建有效的用戶并測試示例。

<%@ page language="vb" masterpagefile="~/site.master"%>
<asp:content id="content1" contentplaceholderid="mainbody" runat="server">
<asp:changepassword id="changepassword1" runat="server" createuserurl="createuser.aspx" createusertext="create a new account" canceldestinationpageurl="homechangepassword.aspx" displayusername="true" continuedestinationpageurl="homechangepassword.aspx"/>
</asp:content>

  使用成員和角色管理器api

  成員

  成員特性是圍繞兩個核心類構建的:membership和membershipuser。membership類提供創建用戶(membershipuser類處理)的方法,以及通用的管理用戶的方法。用membership類建立的用戶是通過asp.net應用程序認證的身份。

  membership類執行的通用事務包括:

  · 創建新的membershipuser

  · 當用戶試圖登錄的時候驗證用戶名-密碼組合。接下來你可以使用窗體認證來生成一個cookie,表明用戶登錄了站點。

  · 檢索membershipuser實例

  · 更新membershipuser實例

  · 根據不同的條件搜索用戶

  · 獲取當前在線的通過認證的用戶

  · 在不需要用戶的時候從系統中刪除它

  一旦你獲取了membershipuser實例,就可以直接使用membershipuser類執行下面的事務:

  · 訪問應用程序中的membershipuser類的屬性

  · 檢索用戶的密碼(只有把成員特性配置為允許密碼檢索才可以使用)

  · 改變或重置用戶的密碼

  · 改變用戶的密碼提問和答案(如果成員特性被配置為在檢索或更新密碼之前,提示用戶密碼問題和答案)

  · 解鎖那些因為密碼錯誤或密碼答案錯誤而被鎖定的用戶

  角色管理器

  角色管理器的核心類是roles類。roles為創建角色和把用戶指定給角色提供方法。它也提供了用于管理角色信息的方法。

  使用roles類可以執行的通用事務包括:

  · 創建新角色

  · 刪除已有的角色

  · 把用戶指定給角色

  · 從角色中刪除用戶

  · 檢測某個用戶是否獲得了特定角色的授權

  · 搜索特定角色中的用戶,檢索角色中的所有用戶

  · 獲取特定用戶的角色信息

  角色管理器特性也包含了httpmodule。這個模塊負責檢索用戶分配的角色并把這些信息存儲在roleprincipal內,而它存在于頁面的httpcontext中。httpcontext中存在roleprincipal使你能夠利用<authorization>元素來保護頁面和目錄。依據roleprincipal中存儲的角色信息,用戶只能獲得站點內特定頁面和目錄的訪問權。

  示例

  下面的例子演示了在應用程序中如何使用成員 api。

  創建新用戶

  下面的例子演示了如何建立新的membershipuser。示例使用了membership.createuser重載,它返回一個狀態參數。其它的重載也可以使用,他們會拋出異常而不是返回狀態代碼。請注意,在默認情況下,成員特性要求密碼至少有7個字符長度,并且密碼至少包含一個非數字字符。

<script runat="server">
sub btncreate_click(byval sender as object, byval e as system.eventargs)
dim username as string = txtuserid.text
'這個值式加密的或散列過,不會顯示
dim password as string = txtpassword.text
dim email as string = txtemail.text
dim passwordquestion as string = ddlpasswordquestion.selectedvalue
'這個值式加密的或散列過,不會顯示
dim passwordanswer as string = txtpasswordanswer.text
dim result as membershipcreatestatus

membership.createuser(username, password, email, passwordquestion, passwordanswer, true, result)

lblresults.visible = true
select case result
case membershipcreatestatus.success
txtuserid.text = nothing
txtpassword.text = nothing
txtemail.text = nothing
ddlpasswordquestion.selectedindex = -1
txtpasswordanswer.text = nothing
lblresults.text = "user successfully created!"
case membershipcreatestatus.invalidusername
lblresults.text = "the username format was invalid. please enter a different username."
case membershipcreatestatus.invalidpassword
lblresults.text = "the password was invalid: a password cannot be an empty string and must also meet the pasword strength requirements of the configured provider. please enter a new password."
case membershipcreatestatus.invalidemail
lblresults.text = "the email format was invalid. please enter a different username."
case membershipcreatestatus.invalidquestion
lblresults.text = "the password question format was invalid. please enter a different question."
case membershipcreatestatus.invalidanswer
lblresults.text = "the password answer format was invalid. please enter a different answer."
case membershipcreatestatus.duplicateusername
lblresults.text = "the username is already in use. please enter a new username."
case membershipcreatestatus.duplicateemail
lblresults.text = "the email address is already in use. please enter a different email address."
case else
lblresults.text = "an error occurred while creating the user."
end select
end sub
</script>

  用戶登錄和訪問用戶屬性

  下面的例子演示了用戶使用membership.validateuser方法登錄。它還演示了在登錄用戶的時候如何同時使用窗體認證和成員特性。在上面的例子中創建用戶之后,請在登錄頁面上輸入憑證。一旦你登錄了,你會被重定向到一個頁面,該頁面利用membership.getuser來檢索與登錄用戶相對應的membershipuser實例。同時請注意,這個頁面還顯示了目錄上設置的用戶屬性,這些內容只有通過認證的用戶才能訪問。點擊頁面底部的登出鏈接可以退出站點。

<script runat="server">
protected memuser as membershipuser

sub page_load(byval sender as object, byval e as system.eventargs)
memuser = membership.getuser()
end sub

sub linklogout_click(byval sender as object, byval e as system.eventargs)
formsauthentication.signout()
roles.deletecookie()
formsauthentication.redirecttologinpage()
end sub
</script>

user name/id: <% = server.htmlencode(memuser.username) %>
email:<% = server.htmlencode(memuser.email) %>

  更新用戶屬性

  請用前面建立的用戶憑證登錄。頁面會用asp.net 2.0中新的detailsview控件顯示用戶屬性。detailsview控件與一個數據源控件通訊。在例子中,objectdatasource控件檢索membershipuser實例的內容。你可以點擊頁面底部的"編輯"鏈接使detailsview進入編輯模式。membershipuser的電子郵件和注釋都可以修改。點擊"更新"鏈接可以把新值保存到數據庫。請注意,在代碼中頁面實現了itemupdating事件,該事件是由objectdatasource引發的。這樣做是必要的,membershipuser類沒有參數化構造函數,它要求使用objectdatasource的雙向數據綁定。點擊登出鏈接可以退出。

sub detailsview1_itemupdating(byval sender as object, byval e as detailsviewupdateeventargs)
'必須手動處理更新操作,因為membershipuser 沒有參數化的構造函數
dim memuser as membershipuser = membership.getuser()

memuser.email = cstr(e.newvalues(0))
memuser.comment = cstr(e.newvalues(1))

try
membership.updateuser(memuser)
e.cancel = true
detailsview1.changemode(detailsviewmode.readonly)
catch ex as exception
response.write("<div>the following error occurred:<font color='red'> " + ex.message + "</font></div>")
e.cancel = true
end try
end sub

  帳號鎖定

  membership特性自動地跟蹤用戶重試密碼的次數。在檢索密碼或重置密碼的時候,它也跟蹤密碼重試的次數。下面的例子演示了自動的帳號鎖定能力,以及如何取消帳號鎖定。首先使用前面的"建立新用戶"示例創建一個新帳號。接著,點擊下方的按鈕運行"帳號登出"示例。登錄頁面顯示了顯示了為了鎖定帳號需要重試的失敗次數。在登錄頁面上,使用你建立的第一個帳號并輸入錯誤的密碼。請注意,在重試的失敗次數到了之后,如果你使用了正確的密碼,也不能登錄了--這是因為在重試失敗的次數到了一定的數量之后,membership特性自動地鎖定的帳號。為了解除該帳號的鎖定,請使用你建立的第二個帳號登錄。顯示的頁面與前面的顯示用戶屬性的例子很相似。但是,這個頁面允許你在頁面底部輸入任意的用戶名稱。請輸入被鎖定的帳號并回車。detailsview控件會刷新并顯示該用戶的信息。請注意,標識鎖定狀態的檢查框islockedout是選中的。lastlockoutdate也被更新了,它顯示了用戶被鎖定的日期。點擊頁面底部的"解鎖"按鈕來解除當前顯示的用戶的鎖。它調用了membershipuser實例的unlockuser方法,解除了用戶的鎖。在解除用戶的鎖之后,islockedout檢查框被清除了,lastlockoutdate屬性也被重置了。點擊頁面底部的登出鏈接。現在嘗試用第一個帳號登錄。現在可以再次成功登錄了。

sub btnunlockuser_click(byval sender as object, byval e as system.eventargs)
dim memuser as membershipuser = membership.getuser(txtusername.text)
if (not memuser is nothing and memuser.islockedout = true)
memuser.unlockuser()
end if

'刷新被選中用戶的信息
detailsview1.databind()
end sub

  刪除用戶

  你可以使用membership.deleteuser方法刪除用戶。下面的例子演示了如何使用窗體認證刪除當前登錄的用戶并讓該用戶登出。

<script runat="server">
sub btndeletecurrentuser_click(byval sender as object, byval e as system.eventargs)
if (membership.deleteuser(user.identity.name)) then
formsauthentication.signout()
roles.deletecookie()
response.redirect("~/creatingusers.aspx")
else
lblresult.visible = true
lblresult.text = "the membership user was not deleted."
end if
end sub
</script>

  管理角色

  下面的例子演示了認證用戶如何使用角色管理器特性。所有的示例頁面都拒絕匿名用戶訪問。在默認情況下,asp.net中是沒有激活角色管理器特性的。但是,下面的例子中使用的web.config顯式地激活了角色管理器特性。

  添加和刪除角色

  下面的例子演示了如何使用roles.createrole和roles.deleterole方法建立和刪除角色。在你建立角色或刪除已有角色之后,頁面使用roles.getallroles方法顯示系統中的所有可用角色。roles.getallroles的返回值可以輕易地綁定到任何支持數據綁定的控件。你至少需要建立一個叫做"administrators"的角色。

  在你建立和刪除角色的時候,請注意角色管理器特性不允許你建立重復的角色。同時還要注意,在默認情況下,角色管理器不允許你刪除填充過的角色。

sub btncreaterole_click(byval sender as object, byval e as system.eventargs)
dim rolename as string = txtcreaterole.text

try
roles.createrole(rolename)
lblresults.text = nothing
lblresults.visible = false
txtcreaterole.text = nothing
catch ex as exception
lblresults.text = "could not create the role: " + server.htmlencode(ex.message)
lblresults.visible = true
end try
end sub

sub btndeleterole_click(byval sender as object, byval e as system.eventargs)
if (lbxavailableroles.selectedindex <> -1) then
try
roles.deleterole(lbxavailableroles.selectedvalue)

lblresults.text = nothing
lblresults.visible = false
catch ex as exception
lblresults.text = "could not delete the role: " + server.htmlencode(ex.message)
lblresults.visible = true
end try
end if
end sub

  向角色中添加用戶和從角色中刪除用戶

  下面的例子使用了前面例子中建立的角色,它演示了如何向角色添加用戶和從角色中刪除用戶。使用roles.addusertorole方法向角色中添加用戶,使用roles.removeuserfromrole方法從角色中刪除用戶。在給角色添加用戶之前,先檢查該用戶是否已經是該角色的成員。這種檢查是必要的,因為如果你試圖給角色多次添加同一個用戶,角色管理器會拋出異常。在前面的例子中,角色信息和角色的成員都顯示在數據綁定控件中。用戶所屬的角色列表通過roles.getrolesforuser方法獲取。要運行下面的例子,就要確保把你自己加入"administrators"角色。

sub btnaddusertorole_click(byval sender as object, byval e as system.eventargs)
if (lbxavailableroles.selectedindex <> -1) then
dim selectedrole as string = lbxavailableroles.selectedvalue

if not roles.isuserinrole(selectedrole) then
try
roles.addusertorole(user.identity.name, selectedrole)
refreshcurrentroleslistbox()
catch ex as exception
lblresults.text = "could not add the user to the role: " + server.htmlencode(ex.message)
lblresults.visible = true
end try
else
lbxavailableroles.selectedindex = -1
end if
end if
end sub

sub btndeleteuserfromrole_click(byval sender as object, byval e as system.eventargs)
dim selectedrole as string = lbxuserroles.selectedvalue

if (lbxuserroles.selectedindex <> -1) then
try
roles.removeuserfromrole(user.identity.name, selectedrole)
refreshcurrentroleslistbox()
catch ex as exception
lblresults.text = "could not remove the user from the role: " + server.htmlencode(ex.message)
lblresults.visible = true
end try
end if
end sub

  用角色管理器對頁面進行授權訪問

  這個例子的web.config文件包含了<authorization>元素,它限制了示例只能讓"administrators"角色的成員訪問。請確保你已經建立了"administrators"角色并把自己添加到了這個角色中。一旦你稱為"administrators"角色的成員,就可以訪問示例頁面了。asp.net提供了一個角色管理器httpmodule,它自動地把roleprincipal附加到當前請求的httpcontext上。如果你是"administrators"角色的成員,當url授權過程根據roleprincipal執行isinrole檢查(url授權過程調用roleprincipal.isinrole)的時候,該訪問檢查會返回true,你就可以訪問頁面了。請注意,你可以通過調用page.user并把結果轉換roleprincipal來引用頁面中的roleprincipal。

<location path="administrators_role">
<system.web>
<authorization>
<allow roles="administrators" />
<deny users="*"/>
</authorization>
</system.web>
</location>

  編程檢查授權

  由于角色管理器特性把roleprincipal附加到httpcontext上,你也可以編寫代碼根據roleprincipal執行訪問檢查。你先建立兩個角色"regular users"和"power users",把自己添加到這兩個角色中。當你運行示例的時候,頁面使用多種技術執行isinrole檢查。有些訪問檢查使用了user.isinrole。它說明了使用正常的page.user語法的時候,roleprincipal也是可用的。這個頁面還演示了如何把page.user轉換為roleprincipal引用,接著直接在roleprincipal上調用isinrole。

<asp:label id="label1" runat="server" text=<%# user.isinrole("administrators") %> />
<asp:label id="label2" runat="server" text=<%# roles.isuserinrole("regular users") %> />
<asp:label id="label3" runat="server" text=<%# (ctype(user,roleprincipal)).isinrole("power users") %> />

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 连山| 囊谦县| 司法| 邻水| 衡南县| 林甸县| 通州区| 昂仁县| 贺兰县| 阳原县| 诸城市| 乐清市| 福鼎市| 临安市| 邵东县| 东光县| 大荔县| 米泉市| 谷城县| 镇远县| 勃利县| 漯河市| 砀山县| 台东市| 曲阜市| 民丰县| 桑日县| 汝阳县| 清新县| 西乡县| 濮阳市| 乐安县| 乐昌市| 中超| 澄江县| 雅江县| 临城县| 余江县| 名山县| 西吉县| 清远市|