Получить токен пользователя, содержащийся в заголовке клиента в веб-API С#

Я использую 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.

«Заголовок должен быть получен в конструкторе»… это не имеет смысла. Конструктор не обрабатывает HTTP-запросы, это делают методы. Он создается перед обработкой любого входящего запроса. Что плохого в том, чтобы получить его в методе? Или, если вам нужно что-то, что вы можете повторно использовать во множестве методов, рассмотрите фильтр действий.

ADyson 09.12.2020 18:06

Ок отлично спасибо!!! Не могли бы вы привести пример, чтобы получить его в методе? Спасибо !

gio 09.12.2020 18:13

Уже было много предыдущих вопросов о том, как получить значение заголовка, например. stackoverflow.com/questions/27971340/… (и не только)

ADyson 09.12.2020 18:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
321
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из вашего вопроса я понимаю, что вы сказали, что атрибут 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()
{
}

Другие вопросы по теме