Как перенаправить неавторизованных пользователей в контроллер? - PullRequest
1 голос
/ 16 апреля 2020

Язык: C# Framework: ASP. NET Core MVC Цель: Сеть

Я создаю веб-приложение для медицинского персонала. Я использовал документацию Microsoft в качестве основы моей реализации. Авторизация на основе утверждений в 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");
    }
}

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете использовать одно из расширений кодовой страницы статуса в ядре asp. net. Есть несколько вариантов на выбор в зависимости от ваших потребностей.

Более подробную информацию о них вы можете найти в MS документах .

Эта статья также дает хорошее описание того, как их использовать (пункты 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...