在本章中,我们将讨论Authorize特性。 到目前为止,在我们的应用程序中,我们允许匿名用户做任何事情。 他们可以编辑员工详细信息,查看详细信息,但我们没有创建新员工的功能。 让我们先添加创建功能,然后我们将使用Authorize属性限制用户访问。

我们需要首先在Views→Home文件夹中创建一个新的MVC View页面,并调用Create.cshtml然后添加以下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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方法,如下面的程序所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[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文件中添加一个指向Create View的链接,如下面的程序所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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链接。 当您单击Create链接,它将带您到创建视图。

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

现在,您将看到新添加的员工的详细信息视图。 让我们点击Home链接。

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

您可以将Authorize属性放在单个控制器上或控制器中的单个操作上。

1
2
3
4
[Authorize] 
public class HomeController : Controller { 
   //....  
}

当我们将Authorize属性放在控制器本身上时,authorize属性应用于其中的所有动作。

MVC框架不允许请求达到受此属性保护的操作,除非用户通过授权检查。

默认情况下,如果不使用其他参数,则只检查Authorize属性将检查以确保用户已登录,以便我们知道其身份。

但您可以使用参数指定任何喜欢的自定义授权策略。

还有一个AllowAnonymous属性。 当您想要使用控制器上的Authorize属性来保护所有操作时,此属性非常有用,但是此单个操作或一个或两个要取消保护的操作,并允许匿名用户访问该特定操作。

1
2
3
4
5
6
7
8
9
10
[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); 
}

让我们在我们的应用程序中尝试这些属性。 在运行的应用程序中,匿名用户可以编辑员工信息。

我们想要更改此选项,并强制用户在编辑员工之前登录并识别自己。 现在让我们进入HomeController。 我们将在此限制访问一个或两个操作。 我们可以始终将Authorize属性放在我们要保护的那些特定操作上。 我们还可以将Authorize属性放在控制器本身上,并且此Authorize属性位于Microsoft.AspNet.Authorization命名空间中。

我们现在将使用Authorize属性,并强制用户识别自己进入此控制器,除了主页,如下面的程序所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
[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属性。 让我们现在运行你的应用程序。

按F12键,打开开发工具。 现在,转到网络选项卡。

我们想在开发者工具中看到一些东西,所以我们可以看到它是如何工作的。 当您单击编辑链接时,您将看到一个空白页。

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

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

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

  • 这里,坏的部分是用户留在空白页面上,除非他们有开发者工具打开,他们可能不知道这是一个身份验证问题。

  • 这就是Identity框架可以介入和帮助的地方。

  • Identity框架可以检测应用程序的某一部分何时希望返回401状态代码,因为用户不允许到达那里,Identity框架可以将其转换为登录页面,并允许用户克服这个问题。

  • 一旦我们得到Identity框架的安装和配置,我们将看到它是如何工作的。

  • 但是现在,我们可以看到Authorize属性正在工作。

版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: Asp.Net Core-Authorize 特性 
本文地址:http://www.yuanjiaocheng.net/ASPNET-CORE/core-authorize-attribute.html

Asp.Net Core-Authorize 特性相关推荐

  1. Asp.Net Core Authorize解析(源码解读)

    一.前言 IdentityServer4已经分享了一些应用实战的文章,从架构到授权中心的落地应用,也伴随着对IdentityServer4掌握了一些使用规则,但是很多原理性东西还是一知半解,故我这里持 ...

  2. asp.net core新特性(1):TagHelper

    进步,才是人应该有的现象.-- 雨果 今天开始,我就来说说asp.net core的新特性,今天就说说TagHelper标签助手.虽然学习.net,最有帮助的就是microsoft的官方说明文档了,里 ...

  3. ASP.NET Core学习资源汇总

    ASP.NET Core入门学习资源汇总篇幅比較長,分为七个部分. (一)认识.NET Core (二)Vistual Studio安装.调试 (三)Asp.Net Core入门指南与学习路线 (四) ...

  4. ASP.NET Core端点路由 作用原理

    端点路由(Endpoint Routing)最早出现在ASP.NET Core2.2,在ASP.NET Core3.0提升为一等公民.Endpoint Routing的动机 在端点路由出现之前,我们一 ...

  5. ASP.NET Core跨平台技术内幕

    ASP.NET Core设计初衷是开源跨平台.高性能Web服务器,其中跨平台特性较早期ASP.NET是一个显著的飞跃,.NET现可以理直气壮与JAVA同台竞技,而ASP.NET Core的高性能特性更 ...

  6. 10个小技巧助您写出高性能的ASP.NET Core代码

    今天这篇文章我们来聊一聊如何提升并优化ASP.NET Core应用程序的性能,本文的大部分内容来自翻译,当然中间穿插着自己的理解,希望对大家有所帮助!话不多说开始今天的主题吧! 我们都知道性能是公共网 ...

  7. asp.net core高级应用:TagHelper+Form

    上一篇博客<asp.net core新特性(1):TagHelper>我讲解了TagHelper的基本用法和自定义标签的生成,那么我就趁热打铁,和大家分享一下TagHelper的高级用法~ ...

  8. asp.net core 自带cookie验证authorize

    asp.core自带的身份验证中cookie是一个比较方便的身份验证工具,在单独的服务器中,该功能比较好用,但是自己在使用的过程中遇到较多问题,在对访问的aciton中添加[authorize]特性之 ...

  9. asp.net core 6 新特性,支持HTTP/3 端点发布

    ???? 序言 Http3 协议构建在UDP的基础上,是的,就这么神奇,以前被誉为不稳定大神的UDP,现在承担起可靠通讯协议的底层协议.为了消除UDP的不确定性,在UDP协议之上,新增了QUIC协议. ...

  10. 如何在 ASP.NET Core 中使用 Route 特性

    ASP.NET Core 中的 Route 中间件的职责在于将 request 匹配到各自 Route 处理程序上,Route 分两种:基于约定 和 基本特性 模式. 基于约定 模式的Route采用集 ...

最新文章

  1. Eigen:C++中Eigen库的安装与学习
  2. java 中的printStackTrace()方法
  3. BZOJ2822 [AHOI2012]树屋阶梯
  4. bash-shell中使用的特殊字符总结
  5. accp8.0转换教材第1章多线程理解与练习
  6. The Python Debugger Command
  7. shellcode免杀
  8. apple 关闭双重认证_这次Apple可以关闭工作吗?
  9. 2^n-1的因数分解问题
  10. JAVA实现时间换算
  11. 一文梳理等保2.0与工业控制系统安全扩展要求
  12. 基于 Self-hosted Debug 的调试
  13. 如何理解特征函数characteristic function
  14. RestTemplate上传图片到指定接口
  15. 【强化学习】模仿学习:生成式对抗模仿学习
  16. linux系统如何关闭触控板,在Deepin Linux 15.7系统中开启或关闭触摸板的方法
  17. html5页面打不开原因,部分网页打不开是什么原因,详细教您网页打不开怎么解决...
  18. Python习题答案
  19. 我所学到的EC-1(个人学习总结,不能保证正确,欢迎大佬指正)
  20. 开集识别(Open Set Recognition, OSR)算法:《Towards Open Set Deep Networks》OpenMax

热门文章

  1. 无线传感器网络标准化进展与协议分析
  2. 不属于python关键字的有_下面不属于python关键字的有
  3. 防火墙、CDN、WAF等防御CC攻击的几种方式
  4. java中treenode的使用_java站如何利用TreeNode构造自定义的树结构?
  5. python多个领域140个常用库 (标准库/第三方库)
  6. layer msg 图标
  7. 64页智慧园区建设规划方案—解锁互联网:智慧园区运营新模式
  8. signature=82227e9056cbba0043e2a50b65e5f14b,重型肝炎150例死亡患者医院感染分析
  9. 看我在项目里怎么用设计模式,这么学设计模式也太简单了!
  10. 将txt转换成pdf格式的操作方法