在本章中,我们将讨论授权属性.到目前为止,在我们的应用程序中,我们允许匿名用户执行任何操作.他们可以编辑员工详细信息并查看详细信息,但我们没有创建新员工的功能.我们先添加创建功能,然后使用Authorize属性限制用户访问.
我们需要先在 Views → 中创建一个新的MVC View页面. Home 文件夹并将其命名为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>
运行应用程序;您将看到以下页面.
开在主页上,您将看到"创建"链接.当您单击"创建"链接时,它将转到"创建视图".
在名称字段中输入名称,然后单击保存按钮.
现在,您将看到新添加员工的详细信息视图.让我们点击主页链接.
In在这个应用程序中,每个用户都可以创建,编辑员工,每个人都可以看到详细信息视图.我们希望更改此行为,以便将来匿名用户只能在主页上看到员工列表,但每个其他操作都要求用户标识自己并登录.我们可以使用授权执行此操作属性.
您可以将Authorize属性放在控制器上或控制器内的各个动作上.
[Authorize] public class HomeController : Controller { //.... }
当我们在控制器本身放置Authorize属性时,authorize属性适用于内部的所有操作.
除非用户通过授权检查,否则MVC框架将不允许请求到达受此属性保护的操作.
默认情况下,如果您不使用其他参数,则只检查Authorize属性将进行检查以确保用户已登录,以便我们知道他们的身份.
但您可以使用参数来指定您喜欢的任何花哨的自定义授权策略.
还有 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); }
让我们在我们的应用程序中尝试这些属性.在正在运行的应用程序中,匿名用户可以编辑员工.
我们希望更改此设置并强制用户在编辑员工之前登录并标识自己.现在让我们进入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属性.现在让我们运行你的应用程序.
按F12键将打开开发人员工具.现在,转到网络标签.
我们希望在开发人员工具中看到一些事情,因此我们可以看到事情是如何运作的.当您单击编辑链接时,您将看到一个空白页.
如果查看开发人员工具,您会看到从服务器返回的HTTP状态代码是 401状态代码.
401状态代码告诉浏览器该请求未被允许通过,因为它缺少有效的身份验证凭据.这告诉我们Authorize属性正在运行.
同样,当您单击主页上的Create链接时,您将看到相同的错误,如以下屏幕截图所示.
在这里,不好的部分是用户留在空白页面,除非他们打开开发人员工具,否则他们可能不知道这是一个身份验证问题.
这是Identity框架可以介入并提供帮助的地方.
Identity框架可以检测应用程序的某个部分何时需要返回401状态代码,因为不允许用户到达那里,并且Identity框架可以将其转换为登录页面并允许用户解决此问题.
一旦我们安装并配置了Identity框架,我们将看到它是如何工作的.
但是现在,我们可以看到e 授权属性正在运作.