2

Для моего проекта mvc5 я применил личность по умолчанию, но изменила его в соответствии с требованиями. Теперь я хотел перенаправить неавторизованных пользователей в представление, которое было создано мной. Я создал специальный фильтр авторизации. Когда неавторизованный пользователь входит, он приходит к моему представлению об ошибках. Я могу узнать его по URL-адресу. Но проблема в том, что он не отображает содержимое в представлении. Вместо этого он показывает ошибку HTTP 404. Я поставил свой код ниже. Я знаю, что это спрашивали здесь несколько раз. Но все же я не мог ее решить. Вся помощь была оценена. Заранее спасибо!Перенаправление неавторизованного пользователя в личность 2.0

public class CustomAuthorize : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new 
      RouteValueDictionary(new { controller = "Error", action = "AccessDenied" })); 
     } 
    } 
} 

ErrorController

public class ErrorController : Controller 
{ 
    // GET: Error 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult AccessDenied() 
    { 
     return View(); 
    } 
} 

AccessDenied вид

<h2>AccessDenied</h2> 

Access Denied 

На конкретном контроллере

[CustomAuthorize(Roles = "Admin")] 
public class ProductTypeController : Controller 
{ 
} 

им Ошибка при получении

HTTP 404. Ресурс, который вы ищете (или его зависимости), мог быть удален, изменилось его имя или временно недоступно. Просмотрите следующий URL-адрес и убедитесь, что оно написано правильно.

ОБНОВЛЕНО ВОПРОС

Теперь я хочу, чтобы перенаправить несанкционированно ErrorView и непроверенным пользователям на странице входа в систему. Я поместил измененный CustomAuthorise ниже. Но это не работает. Pls наставит меня ..

public class CustomAuthorize : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (!httpContext.Request.IsAuthenticated) 
      return false; 
     else 
      return true; 
    } 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(new 
     RouteValueDictionary(new { controller = "Error", action = "AccessDenied" })); 
    } 
} 

ответ

7

Для перенаправления неавторизованных пользователей не нужно настраивать AuthorizeAttribute. Просто в Startup.ConfigureAuth(IAppBuilder app) методе или пользовательский Owin методе запуска добавить следующие строки:

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Error/AccessDenied"), 
    }); 
} 

Но если вы хотите различать непроверенные пользователь и несанкционированными. Написать свой собственный фильтр, как это:

public class MyAuthAttribute: AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new RedirectResult("/Error/AccessDenied"); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     }   
    } 
} 

Затем можно добавить журнал в URL в методе запуска Owin:

LoginPath = new PathString("/Account/Login") 
+0

Спасибо так много раз ... :) Да ваше решение решить ее. Но есть и другая проблема. Неаутентифицированный пользователь также перенаправляется в представление AccessDenied с помощью вашего решения. Но было бы лучше, если бы я мог перенаправить их на страницу входа. Каким будет решение для этого? – Isuru

+0

В этом случае у вас есть специальный фильтр, чтобы проверить вашу привилегию в 'AuthorizeAttribute.AuthorizeCore()', и если пользователь выполнил вход, но не выполнил эту праву страницы, верните false и в 'HandleUnauthorizedRequest' перенаправить его следующим образом:' filterContext.Result = new RedirectResult ("/ Error/AccessDenied") ' –

+0

Я сделал это, как вы сказали. Но это не работает. Прошу вас посоветовать. Я обновил свой вопрос (часть ОБНОВЛЕНО ВОПРОСОВ). – Isuru

Смежные вопросы