Перенаправить пользователя на страницу ошибки без авторизации в mvc - PullRequest
0 голосов
/ 16 июня 2020

Мы используем аутентификацию Windows, и пользователи могут получить доступ к нашему приложению, если они активны.

Я сделал пользователя неактивным и пытаюсь переместить пользователя на страницу с ошибкой, указав

У пользователя нет доступа к приложению.

Фрагмент кода в web.config для включения windows аутентификации.

<system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime />
    <authentication mode="Windows" />
    <customErrors mode="Off" defaultRedirect="mycustomerror.html"></customErrors>
    <pages controlRenderingCompatibilityVersion="4.0" />
        <authorization>
            <allow users="*" />
        </authorization>
</system.web>
<system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
        <security>
            <authentication>
                <windowsAuthentication enabled="true" />
                <anonymousAuthentication enabled="false" />
            </authentication>
        </security>
  </system.webServer>

Мы проверяем в Db , чтобы проверить, активен ли пользователь для доступа к нашему приложению. если пользователь не активен, нам нужно перенаправить пользователя на страницу с ошибкой, и он должен быть перенаправлен на страницу с ошибкой, даже если пользователь пытается ввести имя контроллера / действия в URL.

Я пробовал это в global.asax и не уверен, как перенаправить на страницу с ошибкой.

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);           
    }
    protected async void Session_Start(object sender, EventArgs e)
    {
        if (Session["UserName"] == null)
        {
            IRepository _repository = new Repository();

            var currentUser = await _repository.GetCurrentUser(Path.GetFileName(Context.User.Identity.Name.ToUpper()));

            if (currentUser != null)
            {
                Session["UserName"] = $"{currentUser.FIRST_NAME} {currentUser.LAST_NAME}";
            }
            else
            {
                Response.RedirectToRoute(
                                    new RouteValueDictionary {
                                { "Controller", "Error" },
                                { "Action", "PermissionError" }});
            }
        }
    }

    protected async void Application_PostAuthenticateRequest(Object sender, EventArgs e)
    {
        IRepository _repository = new Repository();

        var currentUser = await _repository.GetCurrentUser(Path.GetFileName(Context.User.Identity.Name.ToUpper()));

        if (currentUser == null || string.IsNullOrEmpty(currentUser.USER_NAME))
        {
            throw new System.Security.Authentication.AuthenticationException("You don't have permission to access application");
        }
    }

Но пользователи, у которых нет доступа, приходят к запросу после аутентификации и показывают страницу с ошибкой. Я хотел бы перенаправить на метод действия и показать страницу ошибки.

Даже когда пользователь пытается ввести URL-адрес, пользователь должен перенаправить на метод действия контроллера ошибки и отобразить страницу ошибки и, пожалуйста, дайте мне знать, как можем ли мы достичь этого.

Пожалуйста, дайте мне знать, возможно ли это, или предложите альтернативное решение.

...