原文:ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程

ASP.NET Core Identity 验证特性

上一章节我们简单介绍了下 Identity 框架,知道 Identity 框架可以用来验证也识别用户。本章节我们就开始进入正题,如何使用 Identity 框架

验证用户身份的第一步就是要标识那些控制器哪些操作需要验证用户,而这一步操作可以使用 Identity 框架提供的 [Authorize] 特性来解决

[Authorize] 就是本章节要讨论的验证特性

到目前为止,在我们的应用程序中,我们已允许匿名用户执行任何操作。任何可以访问我们应用程序的用户,都可以编辑员工详细信息并查看详细信息

咦,好像,我们的应用程序没有创建新员工的功能。那么,我们首先添加创建功能,然后再来讨论如何使用授权特性来限制用户访问

添加新用户

我们先来做这个功能的规划,也就是需求分析

  1. 首先,首页有一个名为 新增员工 的链接,链接到 /home/create 表单页面用于输入新用户的信息 ( 目前为止,也就是员工姓名啦 )

  2. 当输入员工信息后,表单将使用 HTTP POST 方法将提交到 /home/create,数据校验通过并保存后,返回首页

很简单吧,开始吧

我们先双击打开 Views/Home/Index.cshtml ,添加一个名为 新增员工 的链接,链接到 /home/create,完整代码如下

Index.cshtml

@model HomePageViewModel
@{
ViewBag.Title = "职工列表";
}
<style>
body {margin:10px auto;text-align:center}
table {
margin:0 auto;
width:90% }
table, th, td {
border:1px solid #eee;
border-collapse:collapse;
border-spacing:0;
padding:5px;
text-align:center
} .txt-left {
text-align:left;
}
</style>
<h1>职工列表</h1>
<table>
<tr>
<td>ID</td>
<td>姓名</td>
<td class="txt-left">操作</td>
</tr>
@foreach (var employee in Model.Employees)
{
<tr>
<td>@employee.ID</td>
<td>@employee.Name</td>
<td class="txt-left"><a asp-action="Detail" asp-route-Id="@employee.ID">详情</a> &nbsp; <a asp-controller="Home" asp-action="Edit"
asp-route-id="@employee.ID">编辑</a></td>
</tr>
}
</table>
<br/>
<p><a asp-action="Create" >新增员工/a></p>

保存 Index.cshtml 并刷新浏览器,显示如下

点击 新增员工 链接,不用想,肯定报错,因为我们没有添加 Create() 方法

好吧,那我们继续修改 HomeController 类添加一个 Create() 方法

[HttpGet]
public ViewResult Create() {
return View();
}

我们使用 [HttpGet] 来标识该方法只接受 HTTP GET 请求,然后保存文件,当然了,不用重启应用程序,想都不用想,因为我们没有创建 Create.cshtml 所以肯定报错

那么,我们就在 Views/Home/ 目录下创建一个普通视图 Create.cshtml 吧,该视图包含一个表单,表单里只有一个字段,用于输入员工姓名

Create.cshtml

@model Employee
@{
ViewBag.Title = "Create";
}
<h1>新增员工</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="保存" />
</div>
}

是不是又发现了很多新面孔,我们使用了很多标签助手

标签助手 说明
Html.BeginForm 用于创建一个默认使用 HTTP POST 请求方法的 HTML 表单 <form>
Html.LabelFor 用于创建 HTML 标签 <label>
Html.EditorFor 用于创建一个 type 属性默认为 text<input>
Html.ValidationMessageFor 用于显示验证信息

保存所有代码,重新启动应用程序,然后刷新浏览器,输出如下

如果我们输入一些数据,比如 王勃 则继续 404 报错,因为我们没有创建接收 HTTP POST 的 Create 方法

继续修改 HomeController,添加接收 HTTP POST 的 Create() 方法

[HttpPost]
public IActionResult Create(EmployeeEditViewModel model) {
if (ModelState.IsValid) {
var employee = new Employee();
employee.Name = model.Name; SQLEmployeeData sqlData = new SQLEmployeeData( _context );
sqlData.Add(employee);
return RedirectToAction("Detail", new { id = employee.ID });
}
return View();
}

这次几乎没啥新面孔了,至于 sqlData.Add(employee),扳着脚趾头也知道是将数据保存到数据库中的

所以,直接重启应用程序,然后重新提交我们的 王勃,数据验证通过后,就会跳转到王勃的详情页,显示如下

点击返回首页,就可以看到员工 ID 为 4 的王勃了

[Authorize] 与 [AllowAnonymous]

像我这种程序员也能新增员工,那真是大大的,大大的权限啊,如果这样发不到外网,那肯定要被骂死,扣工资,开除,然后喝西北风了

所以,我们赶紧修改下,让匿名用户只能看到主页上的员工列表,其它任何操作都需要用户已经登录

为了实现这个功能,我们可以使用 [Authorize] 特性来限制

我们可以把 [Authorize] 特性放在控制器上,那么该控制器的所有方法都必须需要授权才能访问,也可以放在控制器内的动作方法上,那么只有该动作方法需要授权访问

[Authorize]
public class HomeController : Controller {
//....
}

默认情况下,如果不传递其它参数给 Authorize,授权检查的唯一项目就是确认用户是否已经登录,我们也可以使用参数来指定任何自定义授权策略

除了 [Authorize] 外,还有一个特性 [AllowAnonymous]。当想要在使用了 [Authorize] 特性的某个控制器的动作方法上取消保护并允许匿名用户访问时,可以使用该特性

[AllowAnonymous]
public ViewResult Index() {
//....
}

欧,忘记说了 AuthorizeAllowAnonymous 特性都在命名空间 Microsoft.AspNetCore.Authorization,所以使用之前先要引入该命名空间

好了,介绍的差不多了,接下来我们给 HomeController 加上 [Authorize],然后给 Index() 方法加上 [AllowAnonymous]

添加完成后的完整代码如下

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Authorization; using HelloWorld.Models; namespace HelloWorld.Controllers
{
[Authorize]
public class HomeController: Controller
{ private readonly HelloWorldDBContext _context; public HomeController(HelloWorldDBContext context)
{
_context = context;
} [AllowAnonymous]
public ViewResult Index()
{ var model = new HomePageViewModel();
SQLEmployeeData sqlData = new SQLEmployeeData(_context);
model.Employees = sqlData.GetAll(); return View(model);
} public ViewResult Detail(int id)
{ var model = new HomePageViewModel();
SQLEmployeeData sqlData = new SQLEmployeeData(_context); Employee employee = sqlData.Get(id); return View(employee);
} [HttpGet]
public IActionResult Edit(int id)
{ var model = new HomePageViewModel();
SQLEmployeeData sqlData = new SQLEmployeeData(_context); Employee employee = sqlData.Get(id); if ( employee == null ) {
return RedirectToAction("Index");
} return View(employee);
} [HttpPost]
public IActionResult Edit(int id, EmployeeEditViewModel input)
{
SQLEmployeeData sqlData = new SQLEmployeeData( _context );
var employee = sqlData.Get(id); if (employee != null && ModelState.IsValid)
{
employee.Name = input.Name;
_context.SaveChanges();
return RedirectToAction("Detail", 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; SQLEmployeeData sqlData = new SQLEmployeeData(_context);
sqlData.Add(employee);
return RedirectToAction("Detail", new { id = employee.ID });
}
return View();
} } public class SQLEmployeeData
{
private HelloWorldDBContext _context { get; set; } public SQLEmployeeData(HelloWorldDBContext context)
{
_context = context;
} public void Add(Employee emp)
{
_context.Add(emp);
_context.SaveChanges();
} public Employee Get(int ID)
{
return _context.Employees.FirstOrDefault(e => e.ID == ID);
} public IEnumerable<Employee> GetAll()
{
return _context.Employees.ToList<Employee>();
}
} public class HomePageViewModel
{
public IEnumerable<Employee> Employees { get; set; }
} public class EmployeeEditViewModel
{
[Required, MaxLength(80)]
public string Name { get; set; }
}
}

保存我们的 HomeController.cs,重启应用程序,然后刷新浏览器,当访问首页时,因为允许匿名用户访问,所以可以正常显示

但如果我们点击 新增员工详情编辑 时,则会报错

为什么是报错而不是弹出我们想要的 401 未授权用户.....坑啊

为啥呢? 从错误消息中可以看出,我们还没有对 Identity 进行配置

算了,算了,下一章再说吧

ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程的更多相关文章

  1. ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 迁移数据 上一章节中我们配置了 ...

  2. 从零搭建一个IdentityServer——集成Asp.net core Identity

    前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了基于客户端证书的Oauth2.0授权流程,以及通过access token访问被保护 ...

  3. 【MVC】ASP.NET MVC Forms验证机制

    http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121  文章 - 0  评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...

  4. Asp.net core通过自定义特性实现双端数据验证的一些想法

    asp.net core集成了非常方便的数据绑定和数据校验机制,配合操作各种easy的vs,效率直接高到飞起. 通过自定义验证特性(Custom Validation Attribute)可以实现对于 ...

  5. IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity

    IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity 原文:http://docs.identityserver.io/en/release ...

  6. ASP.NET Core Identity 实战(4)授权过程

    这篇文章我们将一起来学习 Asp.Net Core 中的(注:这样描述不准确,稍后你会明白)授权过程 前情提要 在之前的文章里,我们有提到认证和授权是两个分开的过程,而且认证过程不属于Identity ...

  7. IdentityServer(12)- 使用 ASP.NET Core Identity

    IdentityServer具有非常好的扩展性,其中用户及其数据(包括密码)部分你可以使用任何想要的数据库进行持久化. 如果需要一个新的用户数据库,那么ASP.NET Core Identity是你的 ...

  8. ASP.NET Core Identity Hands On(1)——Identity 初次体验

    ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的成员资格系统,包括成员资格.登录和用户数据存储 这是来自于 ASP.NET Core Identity 仓 ...

  9. ASP.NET Core Identity Hands On(2)——注册、登录、Claim

    上一篇文章(ASP.NET Core Identity Hands On(1)--Identity 初次体验)中,我们初识了Identity,并且详细分析了AspNetUsers用户存储表,这篇我们将 ...

随机推荐

  1. C#+AE实现类似IDentify功能及对高亮显示相关接口的总结

    kenika 原文C#+AE实现类似IDentify功能及对高亮显示相关接口的总结 ArcMap中的Identify功能是有目的查看要素(Feature)属性信息经常使用的工具.ArcMap中的Ide ...

  2. [AngularJS Ng-redux] Integrate ngRedux

    Up to this point, we have created an effective, yet rudimentary, implementation of Redux by manually ...

  3. https://www.cyberciti.biz/faq/howto-change-rename-user-name-id/

    https://www.cyberciti.biz/faq/howto-change-rename-user-name-id/

  4. jquery-11 留言板如何实现

    jquery-11 留言板如何实现 一.总结 一句话总结:用live()方法让后面动态添加的元素也绑定之前对应类绑定的方法. 1.如何让后面动态添加的元素也绑定之前对应类绑定的方法? 用live()方 ...

  5. js进阶正则表达式实现过滤字符串(RegExp对象操作正则表达式)(正则:regular)(表达式:expression)

    js进阶正则表达式实现过滤字符串(RegExp对象操作正则表达式)(正则:regular)(表达式:expression) 一.总结 1.str_replace:正则作用:高效快速匹配 2.break ...

  6. source insight -i failed reason

    双击.c调用sourceinsight.exe -i "路径" 如果路径太长就会新开一个窗口,测试相同文件,不同路径现象不同.

  7. [Angular] Subscribing to router events

    In our root component, one thing we can do is subscribe to Router events, and do something related t ...

  8. Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...

  9. 小强的HTML5移动开发之路(53)——jQueryMobile页面间参数传递

    在单页模版中使用基于HTTP的方式通过POST和GET请求传递参数,而在多页模版中不需要与服务器进行通信,通常在多页模版中有以下三种方法来实现页面间的参数传递. 1.GET方式:在前一个页面生成参数并 ...

  10. C++ 如何快速清空vector以及释放vector内存?

    平时我们在写代码时候,有思考过要主动去释放vector的内存吗? 1.对于数据量不大的vector,没有必要自己主动释放vector,一切都交给操作系统. 2.但是对于大量数据的vector,在vec ...