如何重定向控制器中的未授权用户?

问题描述 投票:0回答:1

语言: 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");
    }
}
c# asp.net-mvc asp.net-core claims-based-identity
1个回答
0
投票

您可以在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");
}
© www.soinside.com 2019 - 2024. All rights reserved.