熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET MVC3:用密碼保護限制view訪問

2013-11-13 09:51:57  來源: .NET編程 

  假設有這麼一個場景你想阻止用戶訪問你網站的特定頁面除非用戶已經注冊並且使用了用戶名和密碼登陸

  解決方案使用一個AccountControllerAccountModels 和 幾個MVC View配合ASPNET的 AuthorizeAttribute 特性FormsAuthentication和Membership creation/validation

  討論

  微軟的MVC團隊已經對賬戶controller做了很多的改進它已經被更新用於Form驗證連同Membership 類去創建新的用戶驗證存在的用戶創建cookie去檢測用戶登入的狀態

  在MVC 中 已經提供了幾種默認的應用程序模板如下圖

  

  ①Empty一個空的模板將創建一些MVC需要的文件結構

  ②Internet Application一個因特網應用程序的默認的模板將要包含一些預配置basic layout一個AccountController包含了多個action(注冊登陸修改密碼等)

  ③Intranet Application內部網應用程序他和第二個模板類似但是他沒有使用Membership 類而是使用了windows身份驗證

  對於大多數網站我們默認應該使用第二個模板如果你現在還沒有這樣做你可以現在創建一個MVC Internet Application

  這將生成AccountController AccountModels 和幾個Account的Views(用戶注冊登陸修改密碼)

  為了組織用戶訪問特定的viewMVC 提供了一個AuthorizeAttribute 特性打開AccountController你可以看到如下代碼



  // GET: /Account/ChangePassword
        [Authorize]
        public ActionResult ChangePassword()
        {
            return View();        }

  它的意圖是只有登陸用戶才可以訪問密碼修改頁面


  當一個用戶訪問頁面/Account/ChangePassword如果他沒有預先登陸或注冊MVC將自動把請求轉到登陸頁面否則MVC將轉到轉到changePassword頁對於未驗證的用戶的跳轉頁面是在nfig裡配置的



  <authentication mode=Forms>
<forms loginUrl=~/Account/LogOn timeout=/>
</authentication>

  如果用戶從來都沒有注冊過那麼他可以在登陸頁點擊注冊跳轉到注冊頁面這個頁面包含以下信息UsernameEmail Address和Password

  AccountController中的Register action 接收一個RegisterModel 類型的參數在AccountModels中有一個類型被定義為RegisterModel它包含了注冊頁面上元素的變量(usernameEmailAddressPassword)

  注冊action



  [HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelStateIsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
MembershipCreateUser(modelUserName
modelPassword modelEmail null null
true null out createStatus);
if (createStatus ==
MembershipCreateStatusSuccess)
{
FormsAuthenticationSetAuthCookie(
modelUserName
false /* createPersistentCookie */);
return RedirectToAction(Index Home);
}
else
{
ModelStateAddModelError(
ErrorCodeToString(createStatus));
}
}
// If we got this far something failed
// redisplay form
return View(model);

  上邊的代碼是自動生成的他們做了三件重要的事

  ①通過MembershipCreateUser()方法創建了一個新的用戶

  ②如果創建成功設置一個cookie給user 確保他可以訪問隨後的頁面

  ③如果創建成功會跳轉到主頁(如果創建失敗將會把錯誤消息顯示到指定的view)

  如果你已經安裝了完整版本的visual studio和SQL Express你可以在數據庫裡看到你創建的user

  方法是在解決方案管理器裡查看AppData下的ASPNETDBMDF直接打開就可以下圖是我剛剛創建的一個用戶

  

  默認的數據庫連接字符串在webconfig裡



<connectionStrings>
<add name=ApplicationServices connectionString=data source=\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdbmdf;
User Instance=trueproviderName=SystemDataSqlClient/>
</connectionStrings>

  將來用戶再次訪問網站的時候如果FormsAuthentication cookie仍然被保存(假設在登錄的時候他選定了記住我選項或者他沒有關閉浏覽器)他們就不需要再次登錄

  如果cookie沒有被保存他就要被導航到登錄頁面了一旦用戶輸入了登陸信息並且提交表單AccountController將再通過Membership 類去驗證用戶如下



  [HttpPost]
public ActionResult LogOn(LogOnModel model
string returnUrl)
{
if (ModelStateIsValid)
{
if (MembershipValidateUser(modelUserName
modelPassword))
{
FormsAuthenticationSetAuthCookie(
modelUserName modelRememberMe);
if (UrlIsLocalUrl(returnUrl)
&& returnUrlLength >
&& returnUrlStartsWith(/)
&& !returnUrlStartsWith(//)
&& !returnUrlStartsWith(/\\))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(Index Home);
}
}
else
{
ModelStateAddModelError(
The user name or password provided
is incorrect);
}
}
// If we got this far something failed
// redisplay form
return View(model);
}

  上邊的代碼頁是自動生成的做了三件事

  ①通過 MembershipValidateUser() 驗證用戶名和密碼

  ②如果登陸成功使用FormsAuthenticationSetAuthCookie 來保存一個cookie

  ③如果通過驗證會導航到主頁否則會在登陸頁顯示錯誤信息

  AuthorizeAttribute 特性可以進一步限定特定的用戶組或者特定的用戶才可以訪問指定的action

  例如



  // Retrieve a list of all users to allow an admin
// to manage them
[Authorize(Roles = Admin)]
public ActionResult UserAdmin()
{
MembershipUserCollection users =
MembershipGetAllUsers();
return View(users);
}
// Create some custom reports for me only
[Authorize(Users = Jamie)]
public ActionResult JamieAdmin()
{
// Perform some logic to generate usage reports

return View();
}


From:http://tw.wingwit.com/Article/program/net/201311/11792.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.