ASP.NET Core - 授權屬性



在本章中,我們將討論授權屬性。到目前為止,在我們的應用程式中,我們允許匿名使用者執行任何操作。他們可以編輯員工詳細資訊和檢視詳細資訊,但我們沒有建立新員工的功能。讓我們首先新增建立功能,然後我們將使用授權屬性限制使用者訪問。

我們需要首先在Views → Home資料夾內建立一個新的 MVC 檢視頁面,並將其命名為 Create.cshtml,然後新增以下程式碼。

@model Employee 
@{ 
   ViewBag.Title = "Create"; 
} 
<h1>Create</h1>  

@using (Html.BeginForm()) { 
   <div> 
      @Html.LabelFor(m => m.Name) 
      @Html.EditorFor(m => m.Name) 
      @Html.ValidationMessageFor(m => m.Name) 
   </div> 
   
   <div> 
      <input type = "submit" value = "Save" /> 
   </div> 
}

我們現在將在 HomeController 中為 POST 和 GET 新增操作方法,如下面的程式所示。

[HttpGet] 
public ViewResult Create() { 
   return View(); 
}  
[HttpPost] 
public IActionResult Create(EmployeeEditViewModel model) {
   if (ModelState.IsValid) { 
      var employee = new Employee(); 
      employee.Name = model.Name;  
      var context = new FirstAppDemoDbContext(); 
      
      SQLEmployeeData sqlData = new SQLEmployeeData(context); 
      sqlData.Add(employee);  
      return RedirectToAction("Details", new { id = employee.Id }); 
   } 
   return View(); 
}

讓我們在 Index.cshtml 檔案中新增一個指向建立檢視的連結,如下面的程式所示。

@model HomePageViewModel  
@{  
   ViewBag.Title = "Home"; 
} 
<h1>Welcome!</h1> 

<table> 
   @foreach (var employee in Model.Employees) { 
   <tr> 
      <td>@employee.Name 
         <td> 
            <a asp-controller = "Home" asp-action = "Details" 
               asp-routeid = "@employee.Id">Details</a> 
            
            <a asp-controller = "Home" asp-action = "Edit" 
               asp-routeid = "@employee.Id">Edit</a> 
         </td> 
      </tr> 
   } 
</table>  

<div> 
   <a asp-action = "Create">Create</a>
</div> 

執行應用程式;您將看到以下頁面。

Create Page

在主頁上,您將看到“建立”連結。當您單擊“建立”連結時,它將帶您到“建立”檢視。

Create Link

在“名稱”欄位中輸入名稱,然後單擊“儲存”按鈕。

Entering a Name Jimmy

您現在將看到新新增的員工的詳細資訊檢視。讓我們單擊“主頁”連結。

Welcome Page

在此應用程式中,每個使用者都可以建立、編輯員工,並且每個人都可以檢視詳細資訊檢視。我們希望更改此行為,以便將來,匿名使用者只能在主頁上檢視員工列表,但其他所有操作都需要使用者識別自己並登入。我們可以使用授權屬性來實現這一點。

您可以將授權屬性放置在控制器上或控制器內的單個操作上。

[Authorize] 
public class HomeController : Controller { 
   //....  
} 
  • 當我們將授權屬性放置在控制器本身上時,授權屬性將應用於其中的所有操作。

  • 除非使用者透過授權檢查,否則 MVC 框架將不允許請求到達受此屬性保護的操作。

  • 預設情況下,如果您不使用其他引數,則授權屬性將執行的唯一檢查是檢查以確保使用者已登入,以便我們知道他們的身份。

  • 但是您可以使用引數指定任何您喜歡的自定義授權策略。

  • 還有一個AllowAnonymous屬性。當您想要在控制器上使用授權屬性來保護其中的所有操作時,此屬性很有用,但隨後有一個或兩個操作您希望取消保護並允許匿名使用者訪問該特定操作。

[AllowAnonymous] 
public ViewResult Index() { 
   var model = new HomePageViewModel(); 
   
   using (var context = new FirstAppDemoDbContext()) { 
      SQLEmployeeData sqlData = new SQLEmployeeData(context); 
      model.Employees = sqlData.GetAll(); 
   }  
   return View(model); 
} 

讓我們在我們的應用程式中嘗試這些屬性。在正在執行的應用程式中,匿名使用者可以編輯員工。

Employee Edit

我們希望更改此行為,並強制使用者在編輯員工之前登入並識別自己。現在讓我們進入 HomeController。我們將在此處限制對一兩個操作的訪問。我們始終可以將授權屬性放置在我們想要保護的特定操作上。我們也可以將授權屬性放置在控制器本身上,此授權屬性位於 Microsoft.AspNet.Authorization 名稱空間中。

我們現在將使用授權屬性並強制使用者識別自己才能進入此控制器,除了主頁,如下面的程式所示。

[Authorize] 
public class HomeController : Controller { 
   [AllowAnonymous] 
   public ViewResult Index() { 
      var model = new HomePageViewModel(); 
      using (var context = new FirstAppDemoDbContext()) { 
         SQLEmployeeData sqlData = new SQLEmployeeData(context); 
         model.Employees = sqlData.GetAll(); 
      }  
      return View(model); 
   }  
   public IActionResult Details(int id) {  
      var context = new FirstAppDemoDbContext(); 
      SQLEmployeeData sqlData = new SQLEmployeeData(context); 
      var model = sqlData.Get(id); 
        
      if (model == null) { 
         return RedirectToAction("Index"); 
      } 
      return View(model); 
   } 
   [HttpGet] 
   public IActionResult Edit(int id) { 
      var context = new FirstAppDemoDbContext(); 
      SQLEmployeeData sqlData = new SQLEmployeeData(context); 
      var model = sqlData.Get(id); 
        
      if (model == null) { 
         return RedirectToAction("Index"); 
      } 
      return View(model); 
   }  
   [HttpPost] 
   public IActionResult Edit(int id, EmployeeEditViewModel input) { 
      var context = new FirstAppDemoDbContext(); 
      SQLEmployeeData sqlData = new SQLEmployeeData(context); 
      var employee = sqlData.Get(id); 
        
      if (employee != null && ModelState.IsValid) { 
         employee.Name = input.Name; 
         context.SaveChanges();  
         return RedirectToAction("Details", new { id = employee.Id }); 
      } 
      return View(employee);
   }  
   [HttpGet] 
   public ViewResult Create() { 
      return View(); 
   }  
   [HttpPost] 
   public IActionResult Create(EmployeeEditViewModel model) { 
      if (ModelState.IsValid) { 
         var employee = new Employee(); 
         employee.Name = model.Name;  
         var context = new FirstAppDemoDbContext(); 
         
         SQLEmployeeData sqlData = new SQLEmployeeData(context); 
         sqlData.Add(employee);  
         return RedirectToAction("Details", new { id = employee.Id }); 
      } 
      return View(); 
   } 
}

顯示員工列表的主頁或Index.cshtml檔案具有AllowAnonymous屬性。現在讓我們執行您的應用程式。

AllowAnonymous attribute

按 F12 鍵,這將開啟開發人員工具。現在,轉到網路選項卡。

Network Tab

在開發人員工具中,我們有一些內容需要觀察,這樣我們就可以瞭解事情是如何運作的。當您單擊“編輯”連結時,您將看到一個空白頁面。

Edit Link

如果您檢視開發人員工具,您將看到從伺服器返回的 HTTP 狀態程式碼是401 狀態程式碼

401 Status Code

401 狀態程式碼告訴瀏覽器請求未被允許透過,因為它缺少有效的身份驗證憑據。這告訴我們授權屬性正在工作。

同樣,當您單擊主頁上的“建立”連結時,您將看到與以下螢幕截圖相同的錯誤。

Same Error
  • 這裡,不好的地方在於使用者被留在空白頁面上,除非他們打開了開發者工具,否則他們可能不知道這是一個身份驗證問題。

  • 這就是身份框架可以介入並提供幫助的地方。

  • 身份框架可以檢測到應用程式的哪個部分想要返回 401 狀態程式碼(因為使用者不被允許訪問),並且身份框架可以將其轉換為登入頁面並允許使用者解決此問題。

  • 一旦我們安裝並配置了身份框架,我們將瞭解其工作原理。

  • 但現在,我們可以看到授權屬性正在工作。

廣告

© . All rights reserved.