语言: C#框架: ASP.NET Core MVC目标:网络
我正在为医务人员创建Web应用程序。我使用Microsoft的文档作为实现的基础。Claims-based authorization in ASP.NET Core
不同的工作人员具有不同的访问级别,因此我提出了一些要求,以防止用户通过在URL中键入某些参数来访问机密信息。简而言之。我想防止未经授权的用户执行以下操作:https://..../Staff/Doctor/PatientInformation
[当用户没有要求的要求时,将引发异常,并返回403页给用户。我想将用户重定向到自定义ErrorView
。
我的推理是改善用户体验。例如,如果用户长时间不活动。该应用程序将出于安全原因以及突然出现错误而自动注销用户。他们可能没有意识到需要重新登录才能访问页面。
问题:引发异常时,如何将控制器中的用户重定向到自定义视图?
我的政策:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("StaffNumber"));
options.AddPolicy("DoctorOnly", policy => policy.RequireClaim("UserID"));
options.AddPolicy("GeneralPractitionerOnly", policy => policy.RequireClaim("UserID"));
options.AddPolicy("PhysiotherapistOnly", policy => policy.RequireClaim("UserID"));
});
}
我的控制器:
[Authorize(Policy = "EmployeeOnly")]
public class StaffController : Controller
{
[Authorize(Policy = "DoctorOnly")]
public ActionResult DoctorResult()
{
return RedirectToAction("Doctor", "Staff");
}
[Authorize(Policy = "GeneralPractitionerOnly")]
public ActionResult GeneralPractitionerResult()
{
return RedirectToAction("Practitioner", "Staff");
}
[Authorize(Policy = "PhysiotherapistOnly")]
public ActionResult PhysiotherapistResult()
{
return RedirectToAction("Physio", "Staff");
}
}
您可以在asp.net核心中使用状态代码页扩展之一。根据您的需求,有一些可供选择。
您可以在MS docs中找到有关它们的更多信息。
[This文章还对如何使用它们提供了很好的描述(本文中的第3、4、5点)。
UseStatusCodePagesWithRedirects可能适合您的需求,您将像这样使用它:
在Startup.cs中-
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//...
app.UseStatusCodePagesWithRedirects("/Home/Error/{0}");
//...
}
然后在您的HomeController(或您决定的任何地方)中创建一个操作来处理状态码-
public IActionResult Error(int statusCode)
{
if (statusCode == 403)
{
return View("YourCustomUnauthorizedView");
}
return View("YourDefaultErrorView");
}