Проблема с фильтром авторизации в AspnetCore 2.1 - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть веб-API Asp.net core 2. и я пытаюсь реализовать пользовательский фильтр авторизации.

На данный момент у меня есть следующее:

 public class AuthorisationAttribute : TypeFilterAttribute
{
    public AuthorisationAttribute() : base(typeof(AuthorisationFilter))
    {
        Arguments = new object[] { new Claim(ClaimTypes.UserData, "will be my user data") };
    }
}
 public class AuthorisationFilter : IAuthorizationFilter
{
    readonly HttpContext _httpContext;
    public AuthorisationFilter(HttpContext httpContext)
    {
        _httpContext = httpContext;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var authorisationCookie = context.HttpContext.Request.Headers.Where(t => t.Key == "auth").FirstOrDefault();

        var temp = new JwtSecurityTokenHandler();
        var unencryptedToken = temp.ReadToken(authorisationCookie.Value) as JwtSecurityToken;

        var session = _httpContext.Session;
        //MORE TO DO HERE YET! Just want to test getting called when expected. 
        return;
    }
}

Тогда по методу контроллера У меня есть:

 public class HomeController : Controller
{
    [Authorisation(),HttpGet]
    public IActionResult Index()
    {
          return View("~/Views/Home/Index.cshtml");
    }
}

Когда я запускаю приложение, вызывается конструктор authorisationAttribute. В момент, когда я пытаюсь вызвать метод контроллера, я получаю следующую ошибку:

InvalidOperationException: подходящий конструктор для типа AuthorisationFilter; не может быть найден. Убедитесь, что тип является конкретным и сервисы прописаны по всем параметрам публичного конструктор.

Итак, в моем файле startup.cs я также добавил:

services.AddScoped<IAuthorizationFilter, AuthorisationFilter>();

но это не имеет значения

1 Ответ

0 голосов
/ 15 ноября 2018

Встроенный DI ничего не знает о текущем HttpContext, сначала вы должны добавить IHttpContextAccessor в коллекцию услуг:

services.AddHttpContextAccessor();

Тогда вы можете получить его в качестве аргумента конструктора фильтров:

public AuthorisationFilter(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

Затем вы можете получить доступ к текущему HttpContext через _httpContextAccessor.HttpContext.

Однако вы также можете получить доступ к текущему HttpContext через AuthorizationFilterContext, как вы уже использовали его в своем примере кода:

context.HttpContext

Редактировать : Поскольку вы устанавливаете свойство Argument для TypeFilterAttribute, вы должны создать в своем фильтре конструктор, который использует этот аргумент, например:

public AuthorisationFilter(Claim claim)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...