【发布时间】:2020-07-29 16:12:23
【问题描述】:
语言: C#
框架: ASP.NET Core MVC
目标: Web
我正在为医务人员创建一个 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");
}
}
【问题讨论】:
-
为什么当前的 403(Forbidden) 不行?
-
我想向用户提供更多信息。例如,如果用户长时间处于非活动状态。出于安全原因,如果用户突然出现错误,应用程序将自动注销用户。他们可能没有意识到需要重新登录才能访问页面。
-
确实,您可以使用 Web.config 将 403(和其他错误)重定向到您的 ErrorView 或您想要的任何位置。您可以编写一个自定义提供程序来做更多事情,但这似乎有点过头了。
-
@Coding 是一次冒险,您想重定向未经授权的控制器?如果用户没有访问该控制器的凭据
-
@Rahul 如果用户没有访问控制器所需的声明或声明为空/null。
标签: c# asp.net-mvc asp.net-core claims-based-identity