2016-11-06 4 views
0

Я переношу свой проект в ядро ​​asp.net, и я застрял в переносе моего атрибута CustomAuthorization для своих контроллеров. Вот мой код.Как переопределить HandleUnauthorizedRequest в ASP.NET Core

public class CustomAuthorization : AuthorizeAttribute 
{ 
    public string Url { get; set; } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new RedirectResult(Url + "?returnUrl=" + filterContext.HttpContext.Request.Url.PathAndQuery); 
     } 
     else if (!Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole)) 
     { 
      filterContext.Result = new ViewResult 
      { 
       ViewName = "AcessDenied" 
      }; 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

тогда я использовал его для моих контроллеров

[CustomAuthorization(Url = "/Admin/Account/Login", Roles = "Admin")] 
public abstract class AdminController : Controller { } 

так, в принципе я могу использовать его для перенаправления на другую страницу входа в систему, когда роли не выполняется. У меня мало областей, и у каждой из них есть другая страница входа. Я попытался с помощью CookieAuthenticationOptions как этот

services.Configure<CookieAuthenticationOptions>(options => 
{ 
    options.AuthenticationScheme = "Admin"; 
    options.LoginPath = "/Admin/Account/Login"; 
}); 

затем на мой контроллер администратора

[Area("Admin")] 
[Authorize(ActiveAuthenticationSchemes = "Admin", Roles = "Admin")] 

, но после того, как я войти в систему, она по-прежнему не могу получить.

+0

Вы пробовали пошагового этот код? Выполняется ли это? Где это происходит? – Darkonekt

+0

Взгляните на http://stackoverflow.com/questions/31464359/custom-authorizeattribute-in-asp-net-5-mvc-6 –

ответ

1

я делаю что-то подобное в одном моих проектов. Этот ответ НЕ использует AuthorizeAttribute; но это может помочь кому-то приземлиться здесь из поиска Google. В моем случае я использую его для авторизации на основе пользовательской логики.

Первый мой пользовательский класс атрибута:

public class CustomAuthorizationAttribute : ActionFilterAttribute 
{ 
    private readonly IMyDepedency _dp; 
    public CustomAuthorizationAttribute(IMyDepedency dp) 
    { 
     _dp = dp; 
    } 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var isValid = false; 
     //write my validation and authorization logic here 
     if(!isValid) 
     { 
      var unauthResult = new UnauthorizedResult(); 

      context.Result = unauthResult;     
     } 

     base.OnActionExecuting(context); 
    } 
} 

Я декорировать свои контроллеры, как это:

[ServiceFilter(typeof (CustomAuthorizationAttribute))] 

Тогда в моем классе Startup

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 

    // my other stuff that is not relevant in this post 

    // Security 
    services.AddTransient<CustomAuthorizationAttribute>(); 
}