Я использую Entity framework с генератором токенов JWT в своем веб-API. Каждый контроллер [Авторизован] для предотвращения неавторизованных вызовов API. Таким образом, когда клиент вызывает API, он отправляет заголовок, содержащий токен, для оценки. Есть ли способ прочитать этот токен? Он содержит информацию о значении пользователя компании и необходим для определения правильной базы данных.
[Authorize]
[ApiController]
public class MyClass: ControllerBase
{
private readonly IMessageRepository dB;
public MyClassController(IMessageRepository messageRepository)
{
this.dB = messageRepository;
// something to retrieve header here.
}
/// <summary>
/// Return the list of X contained in the DB
/// </summary>
[HttpGet(ApiRoutes.MyRoute)]
public List<Object> Get()
{
var x = dB.Get();
return x;
}
Я не знаю, возможно ли это, но заголовок должен быть получен в конструкторе, а не в методе API.
Ок отлично спасибо!!! Не могли бы вы привести пример, чтобы получить его в методе? Спасибо !
Уже было много предыдущих вопросов о том, как получить значение заголовка, например. stackoverflow.com/questions/27971340/… (и не только)
Из вашего вопроса я понимаю, что вы сказали, что атрибут Authorize срабатывает до того, как срабатывает метод действия, и он автоматически решает, должен ли этот вызов войти внутрь метода действия или нет, и вы хотите перехватить этот вызов.
Итак, мой друг, в Mvc есть пара фильтров действий, которые вызывают метод действия до и после, а «Авторизовать фильтр» всегда запускается перед вашим методом действия, как только я сталкиваюсь с этой проблемой, и в то время я использовал пользовательский атрибут для захвата материала.
Этот класс унаследован от «AuthorizeAttribute», а также [Authorize], производный от абстрактного класса «AuthorizationFilterAttribute», поэтому здесь мы в некотором смысле переопределяем.
вы можете настроить его по своему усмотрению
Может быть, это поможет вам!
public class CustomAuthorize : AuthorizeAttribute
{
public string Permissionname { get; set; }
public CustomAuthorize (string PermissionName)
{
Permissionname = PermissionName;
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
ClaimsIdentity claimsIdentity = HttpContext.Current.User.Identity as ClaimsIdentity;
var _roles = claimsIdentity.FindAll(ClaimTypes.Role).ToList();
bool isAuthorized = false;
if (Permissionname!= "" && Permissionname != "AuthorizeOnly")
{
foreach (var item in _roles)
{
if (item != null && item.Value != null && item.Value.ToLower() == Permissionname.ToLower())
{
isAuthorized = base.IsAuthorized(actionContext);
}
}
}
else
{
isAuthorized = base.IsAuthorized(actionContext);
}
return isAuthorized;
}
protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
//Setting error message and status Code 403 for unauthorized user
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
Content = new StringContent(JsonConvert.SerializeObject(new { Message = "Authorization failed or user don't have permission!" })),
StatusCode = HttpStatusCode.Forbidden
};
}
}
Вы можете так вызывать свой метод действия
CustomAuthorize("CanViewLeads")]
Public HttpResponseMessage ActionMethodXYZ()
{
}
«Заголовок должен быть получен в конструкторе»… это не имеет смысла. Конструктор не обрабатывает HTTP-запросы, это делают методы. Он создается перед обработкой любого входящего запроса. Что плохого в том, чтобы получить его в методе? Или, если вам нужно что-то, что вы можете повторно использовать во множестве методов, рассмотрите фильтр действий.