Я использую Web Api 2.1 с идентификатором Asp.Net 2. Я пытаюсь получить аутентифицированного пользователя в своем конструкторе ApiController (я использую AutoFac для ввода моих зависимостей), но пользователь показывает, что он не аутентифицирован, когда конструктор называется.
Я пытаюсь получить Пользователя, чтобы я мог генерировать информацию аудита для любых операций записи в БД.
Несколько вещей, которые я делаю, могут помочь в диагнозе:
Я использую только app.UseOAuthBearerTokens
как аутентификацию с помощью Asp.Net Identity 2. Это означает, что я удалил app.UseCookieAuthentication(new CookieAuthenticationOptions())
, который включен по умолчанию при создании нового проекта Web Api 2.1 с идентификатором Asp.Net 2.
Внутри WebApiConfig
Я вставляю свой репозиторий:
builder.RegisterType<ValueRepository>().As<IValueRepository>().InstancePerRequest();
Здесь мой контроллер:
[RoutePrefix("api/values")]
public class ValuesController : ApiController
{
private IValueRepository valueRepository;
public ValuesController(IValueRepository repo)
{
valueRepository = repo;
// I would need the User information here to pass it to my repository
// something like this:
valueRepository.SetUser(User);
}
protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
// User is not avaliable here either...
}
}
Но если я проверяю объект User на конструкторе, это то, что я получаю:
Проверка подлинности работает, если я не передаю свой токен, он ответит Unauthorized
. Если я передаю токен, и я пытаюсь получить доступ к пользователю из любого из методов, он проверяется и заполняется правильно. Он просто не отображается на конструкторе, когда он вызывается.
В моем WebApiConfig
я использую:
public static void Register(HttpConfiguration config)
{
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// ... other unrelated injections using AutoFac
}
Я заметил, что если я удалю эту строку: config.SuppressDefaultHostAuthentication()
Пользователь заносится в конструктор.
Ожидается ли это? Как я могу получить аутентифицированного пользователя в конструкторе?
EDIT: Как предложил Рикард, я попытался получить пользователя в методе Initialize, но он все еще не доступен, что дает мне то же самое, что описано на изображении.