ASP.NET Core - 授权

首页 / ASP.Net Core / Authorize Attribute

在本章中,无涯教程将讨论Authorize属性,到目前为止,在应用程序中,已经允许匿名用户执行任何操作,他们可以编辑员工详细信息并查看详细信息,但是没有创建新员工的功能。首先添加创建功能,然后使用Authorize属性限制用户访问。

首先需要在 Views→Home 文件夹中创建一个新的MVC View页面,并将其命名为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添加 action方法,如以下程序所示。

无涯教程网

[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"链接。单击"Create"链接时,它将带您进入"Create view"。

Create Link

在名称字段中输入名称,然后单击保存按钮。

Entering a Name Jimmy

现在,您将看到新添加员工的详细视图。单击"Home"链接。

Welcome Page

在此应用程序中,每个用户都可以创建,编辑员工,每个人都可以看到详细信息视图,要更改此行为,以便匿名用户只能在主页上看到员工列表,但是其他所有操作都需要用户标识自己的身份并登录,可以使用 Authorize属性。

您可以将Authorize属性放在控制器上或控制器内部的单个动作上。

[Authorize] 
public class HomeController : Controller { 
   //....  
} 
  • 在控制器本身上放置Authorize属性时,authorize属性将应用于内部的所有操作。

  • 除非用户通过授权检查,否则MVC框架将不允许请求执行受此属性保护的操作。

  • 默认情况下,如果不使用其他参数,则Authorize属性将进行的唯一检查就是确保用户已登录,以便知道其身份。

  • 还有一个AllowAnonymous属性。当您想使用控制器上的Authorize属性来保护其中的所有动作时,此属性很有用,但是您想要取消保护此单个动作或一个或两个动作并允许匿名用户执行该特定动作。

[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,在此,将限制访问操作。始终可以将Authorize属性放要保护的那些特定操作上,还可以将Authorize属性放在控制器本身上,并且此Authorize属性位于Microsoft.AspNet.Authorization命名空间中。

现在,将使用Authorize属性,并强制用户标识自己进入此控制器,但以下程序所示的主页除外。

[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"标签。

Network Tab

无涯教程希望在开发人员工具中注意几件事,因此可以看到它们是如何工作的。单击"Edit"链接时,将看到空白页。

Edit Link

如果您查看开发人员工具,则会看到从服务器返回的HTTP状态代码是 401状态代码。

401 Status Code

401状态码告诉浏览器,由于缺少有效的身份验证凭据,因此不允许该请求通过,这告诉Authorize属性正在工作。

同样,当您单击主页上的"Create"链接时,您将看到与以下屏幕截图所示相同的错误。

Same Error

这一章《ASP.NET Core - 授权》你学到了什么?在下面做个笔记吧!做站不易,你的分享是对我们最大的支持,感谢!😊

相关文章

趣谈网络协议 -〔刘超 - 51讲〕

面试现场 -〔白海飞 - 40讲〕

透视HTTP协议 -〔罗剑锋(Chrono) - 46讲〕

NLP实战高手课 -〔王然 - 160讲〕

如何在 HttpClient 上设置默认用户代理?

在 Asp.Net Core App 中访问 Web.config 设置?

如何关闭由 ASP.NET 核心框架完成的日志(log)记录

ASP.Net-Core 中的自定义身份验证

如何防止 Azure 网站进入Hibernate 状态?

预定义类型“System.Object”未定义或导入.net 4.6

视频推荐〔ASP.Net Core - part4-11:什么是rest〕

更多视频 »
好记忆不如烂笔头。留下你的足迹吧 :)