如何在控制器中重定向未经授权的用户?
How to redirect unauthorised users in the controller?
语言:C#
框架:ASP.NET核心 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");
}
语言:C#
框架:ASP.NET核心 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");
}