【问题标题】:How to redirect unauthorised users in the controller?如何在控制器中重定向未经授权的用户?
【发布时间】: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


【解决方案1】:

您可以使用 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");
}

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多