在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C#/ ASP.Net MVC安全
ASP.Net MVC簡(jiǎn)介
ASP.Net MVC過(guò)濾器
ASP.Net MVC視圖
ASP.Net MVC安全
ASP.Net MVC手腳架
ASP.Net MVC控制器
ASP.Net MVC與SQL Server數(shù)據(jù)庫(kù)操作
ASP.Net MVC NuGet包管理
ASP.Net MVC入門(mén)程序
ASP.Net MVC Razor
ASP.Net MVC Bootstrap
ASP.Net MVC單元測(cè)試
ASP.Net MVC動(dòng)作
ASP.Net MVC模式
ASP.Net MVC選擇器
ASP.Net MVC開(kāi)發(fā)環(huán)境配置
ASP.Net MVC生命周期
ASP.Net MVC模型綁定
ASP.Net MVC自托管(本地主機(jī)部署)
ASP.Net MVC驗(yàn)證
ASP.Net MVC緩存
ASP.Net MVC數(shù)據(jù)模型
ASP.Net MVC路由
ASP.Net MVC教程
ASP.Net MVC助手
ASP.Net MVC數(shù)據(jù)注解
ASP.Net MVC Web API

ASP.Net MVC安全

在本章中,我們將討論如何在應(yīng)用程序中實(shí)現(xiàn)安全功能。還將看到ASP.NET中包含的新成員特性,并可從ASP.NET MVC中使用。在ASP.NET的最新版本中,可以通過(guò)以下方式管理用戶(hù)身份 -

  • SQL數(shù)據(jù)庫(kù)
  • 本地Windows活動(dòng)目錄

在本章中,我們將介紹作為ASP.NET一部分的新身份組件,并了解如何自定義用戶(hù)和角色的成員資格。

認(rèn)證

用戶(hù)的認(rèn)證意味著驗(yàn)證用戶(hù)的身份,這真的很重要??赡苄枰獙⒛膽?yīng)用程序僅顯示給經(jīng)過(guò)身份驗(yàn)證的用戶(hù),原因很明顯。
我們來(lái)創(chuàng)建一個(gè)新的ASP.Net MVC應(yīng)用程序項(xiàng)目:MVCSecurity 。點(diǎn)擊確定 繼續(xù)。

當(dāng)啟動(dòng)一個(gè)新的ASP.NET應(yīng)用程序時(shí),這個(gè)過(guò)程中的一個(gè)步驟就是為應(yīng)用程序需要配置身份驗(yàn)證服務(wù)。選擇MVC模板,將看到現(xiàn)在啟用了更改認(rèn)證按鈕。

這是通過(guò)出現(xiàn)在“新建項(xiàng)目”對(duì)話(huà)框中的“更改認(rèn)證”按鈕完成的。默認(rèn)身份驗(yàn)證是個(gè)人用戶(hù)帳戶(hù)。

認(rèn)證選項(xiàng)

當(dāng)單擊更改按鈕時(shí),您將看到一個(gè)對(duì)話(huà)框,其中包含四個(gè)選項(xiàng),如下所示。

1. 不進(jìn)行身份驗(yàn)證

第一個(gè)選項(xiàng)是不驗(yàn)證,當(dāng)想建立一個(gè)不關(guān)心訪問(wèn)者是誰(shuí)的網(wǎng)站時(shí)使用這個(gè)選項(xiàng)。

它是開(kāi)放給任何人和每個(gè)人連接為每一個(gè)頁(yè)面。以后可以隨時(shí)更改,但“不進(jìn)行身份驗(yàn)證” 選項(xiàng)意味著不會(huì)有任何功能來(lái)識(shí)別訪問(wèn)該網(wǎng)站的用戶(hù)。

2. 個(gè)人用戶(hù)帳戶(hù)

第二個(gè)選項(xiàng)是個(gè)人用戶(hù)帳戶(hù),這是用戶(hù)可以訪問(wèn)網(wǎng)站的傳統(tǒng)的基于表單的身份驗(yàn)證。 他們可以注冊(cè),創(chuàng)建一個(gè)登錄名,默認(rèn)情況下,用戶(hù)名是使用一些新的ASP.NET身份特性存儲(chǔ)在SQL Server數(shù)據(jù)庫(kù)中。

密碼也存儲(chǔ)在數(shù)據(jù)庫(kù)中,但首先被散列。由于密碼是散列的,因此不必?fù)?dān)心在數(shù)據(jù)庫(kù)中的純文本密碼而被別人知道。

此選項(xiàng)通常用于要建立用戶(hù)身份的Internet站點(diǎn)。 除了允許用戶(hù)使用網(wǎng)站的密碼創(chuàng)建本地登錄外,還可以啟用來(lái)自Microsoft,Google,F(xiàn)acebook和Twitter等第三方的登錄。

這允許用戶(hù)使用他們的真實(shí)帳戶(hù)或他們的Twitter帳戶(hù)登錄到您的網(wǎng)站,但是您不需要存儲(chǔ)任何密碼。

這將在這個(gè)模塊中花費(fèi)一些時(shí)間的選項(xiàng)。個(gè)人用戶(hù)帳戶(hù) 選項(xiàng)。

3. 工作和學(xué)校帳戶(hù)

第三個(gè)選擇是使用組織帳戶(hù),這通常用于使用活動(dòng)目錄聯(lián)合服務(wù)的業(yè)務(wù)應(yīng)用程序。

將設(shè)置Office 365或使用Azure Active Directory服務(wù),并且您有內(nèi)部應(yīng)用程序和云應(yīng)用程序的單一登錄。

您還需要提供應(yīng)用程序ID,以便應(yīng)用程序需要在Windows Azure管理門(mén)戶(hù)(如果這是基于Azure的)上進(jìn)行注冊(cè),并且應(yīng)用程序ID將在所有可能注冊(cè)的應(yīng)用程序中唯一標(biāo)識(shí)此應(yīng)用程序。

4. Windows身份驗(yàn)證

第四個(gè)選項(xiàng)是Windows身份驗(yàn)證 ,適用于Intranet應(yīng)用程序。

用戶(hù)登錄到Windows桌面,并可以將瀏覽器啟動(dòng)到位于同一防火墻內(nèi)的應(yīng)用程序。 ASP.NET可以自動(dòng)獲取用戶(hù)的身份,即由活動(dòng)目錄建立的身份。 該選項(xiàng)不允許任何匿名訪問(wèn)該站點(diǎn),但這也是一個(gè)可以更改的配置設(shè)置。

下面我們來(lái)看看基于表單的身份驗(yàn)證 ,即名稱(chēng)為個(gè)人用戶(hù)帳戶(hù)的身份驗(yàn)證。 此應(yīng)用程序?qū)⒂脩?hù)名和密碼,舊密碼存儲(chǔ)在本地SQL Server數(shù)據(jù)庫(kù)中,創(chuàng)建此項(xiàng)目時(shí),Visual Studio也將添加NuGet包。

現(xiàn)在運(yùn)行這個(gè)應(yīng)用程序,當(dāng)您第一次訪問(wèn)這個(gè)應(yīng)用程序,那么是以一個(gè)匿名用戶(hù)來(lái)訪問(wèn)的。

因?yàn)槟€沒(méi)有登錄的賬戶(hù),所以需要在這個(gè)網(wǎng)站上先注冊(cè)一個(gè)用戶(hù)。

點(diǎn)擊注冊(cè) 鏈接,會(huì)看到下面的視圖。

輸入您的電子郵件ID和密碼,例如:maxsu@yiibai.comAbc@123。

點(diǎn)擊注冊(cè)。 現(xiàn)在,應(yīng)用程序?qū)⑹褂么速~戶(hù)信息識(shí)別您。

它將能夠顯示用戶(hù)的名字。 在下面的截圖中,可以看到:“你好,maxsu@yiibai.com!” 。 可以點(diǎn)擊它鏈接到一個(gè)頁(yè)面,可以在這個(gè)頁(yè)面中更改密碼。

也可以注銷(xiāo),關(guān)閉,重新啟動(dòng),一個(gè)星期后回來(lái),應(yīng)該可以使用之前使用的憑據(jù)登錄?,F(xiàn)在點(diǎn)擊注銷(xiāo) 按鈕,它將顯示以下頁(yè)面。再次點(diǎn)擊登錄鏈接進(jìn)入下一頁(yè)??梢允褂孟嗤膽{據(jù)重新登錄。

很多工作都在幕后進(jìn)行到現(xiàn)在。 但是,我們想要做的是檢查每個(gè)功能,看看這個(gè)UI是如何構(gòu)建的。 什么是管理注銷(xiāo)和登錄過(guò)程? 這些信息在數(shù)據(jù)庫(kù)中排序?

讓我們從一些簡(jiǎn)單的基礎(chǔ)開(kāi)始。 首先,我們將看到這個(gè)用戶(hù)名是如何顯示的。 從解決方案資源管理器中的View/Shared文件夾中打開(kāi)_Layout.cshtml

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - 我的 ASP.NET 應(yīng)用程序</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")

</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @Html.ActionLink("應(yīng)用程序名稱(chēng)", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("主頁(yè)", "Index", "Home")</li>
                    <li>@Html.ActionLink("關(guān)于", "About", "Home")</li>
                    <li>@Html.ActionLink("聯(lián)系方式", "Contact", "Home")</li>
                </ul>
                @Html.Partial("_LoginPartial")
            </div>
        </div>
    </div>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>? @DateTime.Now.Year - 我的 ASP.NET 應(yīng)用程序</p>
        </footer>
    </div>

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>
</html>

有一個(gè)共同的導(dǎo)航欄,應(yīng)用程序名稱(chēng),菜單,并有一個(gè)局部視圖呈現(xiàn)為_loginpartial。 這實(shí)際上是顯示用戶(hù)名或注冊(cè)和登錄名的視圖。 所以_loginpartial.cshtml也在shared文件夾中。其代碼如下所示 -

@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
    using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
    {
    @Html.AntiForgeryToken()

    <ul class="nav navbar-nav navbar-right">
        <li>
            @Html.ActionLink("你好," + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
        </li>
        <li><a href="javascript:document.getElementById('logoutForm').submit()">注銷(xiāo)</a></li>
    </ul>
    }
}
else
{
    <ul class="nav navbar-nav navbar-right">
        <li>@Html.ActionLink("注冊(cè)", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li>
        <li>@Html.ActionLink("登錄", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li>
    </ul>
}

正如可以看到上面,有if/else語(yǔ)句。 如果請(qǐng)求沒(méi)有被認(rèn)證,這個(gè)視圖將顯示注冊(cè)和登錄鏈接。用戶(hù)可以點(diǎn)擊鏈接登錄注冊(cè)。所有這些都是由帳戶(hù)控制器完成的。

現(xiàn)在,我們想看看如何獲取用戶(hù)名,這是在Request.IsAuthenticated。 可以看到對(duì)User.Identity.GetUserName的調(diào)用。這將檢索用戶(hù)名,在這種情況下是"maxsu@yiibai.com"

授權(quán)

假設(shè)想要防止未經(jīng)驗(yàn)證的用戶(hù)的信息。 因此,讓我們創(chuàng)建一個(gè)新的控制器來(lái)顯示這些信息,但只有當(dāng)用戶(hù)登錄時(shí)才能操作。

右鍵單擊Controllers 文件夾,然后選擇:添加 -> 控制器 。選擇一個(gè)MVC 5控制器 - 空 控制器,然后點(diǎn)擊“添加”。輸入名稱(chēng)SecretController,然后單擊“添加” 按鈕。

它將會(huì)有兩個(gè)動(dòng)作,如下面的代碼所示。參考以下代碼 -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCSecurity.Controllers
{
    public class SecretController : Controller
    {
        // GET: Secret
        public ActionResult Index()
        {
            return View();
        }
        // GET: Secret
        public ContentResult Secret()
        {
            return Content("Secret informations here");
        }

        public ContentResult PublicInfo()
        {
            return Content("Public informations here");
        }
    }
}

當(dāng)運(yùn)行這個(gè)應(yīng)用程序時(shí),可以在沒(méi)有任何驗(yàn)證的情況下訪問(wèn)這個(gè)信息(URL:http://localhost:57742/Secret/Secret),如下面的截圖所示。

假設(shè)只有經(jīng)過(guò)身份驗(yàn)證的用戶(hù)才能夠使用Secret動(dòng)作方法,并且任何人都可以使用PublicInfo,而不需要任何身份驗(yàn)證。

為了保護(hù)這個(gè)特定的操作并保證未經(jīng)身份驗(yàn)證的用戶(hù)到達(dá)此處,可以使用Authorize屬性。 沒(méi)有任何其他參數(shù)的授權(quán)屬性將確保用戶(hù)的身份是已知的,他們不是一個(gè)匿名用戶(hù)。

// GET: Secret
[Authorize]
public ContentResult Secret(){
   return Content("Secret informations here");
}

現(xiàn)在再次運(yùn)行這個(gè)應(yīng)用程序,并指定相同的URL:http://localhost:57742/Secret/Secret。 MVC應(yīng)用程序?qū)z測(cè)到您無(wú)權(quán)訪問(wèn)應(yīng)用程序的特定區(qū)域,并且會(huì)自動(dòng)重定向到登錄頁(yè)面,在那里登錄并嘗試返回訪問(wèn)受限的應(yīng)用程序的URL。

可以看到它在返回URL中指定,它告訴此頁(yè)面,如果用戶(hù)成功登錄,則將其重定向到/secret/secret。

輸入您的用戶(hù)名和密碼,然后點(diǎn)擊“登錄”按鈕。會(huì)看到它直接進(jìn)入該頁(yè)面。

當(dāng)不想在每一個(gè)動(dòng)作上進(jìn)行授權(quán)的時(shí)候,當(dāng)想要在一個(gè)控制器里,幾乎所有的事情都需要授權(quán)。 在這種情況下,總是可以將此過(guò)濾器應(yīng)用于控制器本身,現(xiàn)在,此控制器內(nèi)部的每個(gè)操作都將要求用戶(hù)進(jìn)行身份驗(yàn)證。

using System.Web.Mvc;

namespace MVCSecurityDemo.Controllers{
   [Authorize]
   public class SecretController : Controller{
      // GET: Secret
      public ContentResult Secret(){
         return Content("Secret informations here");
      }

      public ContentResult PublicInfo(){
         return Content("Public informations here");
      }
   }
}

但是,如果想要任何人都可以打開(kāi)某一個(gè)操作,則可以使用另一個(gè)屬性(即AllowAnonymous)覆蓋此授權(quán)規(guī)則。參考以下代碼 -

using System.Web.Mvc;

namespace MVCSecurityDemo.Controllers{
   [Authorize]
   public class SecretController : Controller{
      // GET: Secret
      public ContentResult Secret(){
         return Content("Secret informations here");
      }

      [AllowAnonymous]
      public ContentResult PublicInfo(){
         return Content("Public informations here");
      }
   }
}

使用Authorize屬性,也可以指定一些參數(shù),比如允許一些特定的用戶(hù)進(jìn)入這個(gè)動(dòng)作。

using System.Web.Mvc;

namespace MVCSecurityDemo.Controllers{
   [Authorize(Users = "maxsu@yiibai.com")]
   public class SecretController : Controller{
      // GET: Secret
      public ContentResult Secret(){
         return Content("Secret informations here");
      }

      [AllowAnonymous]
      public ContentResult PublicInfo(){
         return Content("Public informations here");
      }
   }
}

當(dāng)運(yùn)行此應(yīng)用程序并轉(zhuǎn)到URL:/secret/secret時(shí),如果它不是此控制器要求的用戶(hù)(maxsu@yiibai.com),它會(huì)要求您登錄。


下一篇:ASP.Net MVC助手