У меня есть n-уровневый проект web api 2, который структурирован так:
- Веб-слой
- Сервис / Бизнес Уровень
- Уровень данных / репозитория
Веб-контроллеры имеют соответствующую службу, внедренную с помощью Autofac, и каждая служба имеет соответствующий внедренный репозиторий. Это отлично работает.
Теперь мне нужно добавить объект, который имеет некоторую информацию о пользователе, для целей бизнес-логики. Похоже на это:
public class OrderService : IOrderService
{
private readonly IOrderRepo _Repo;
private readonly EnterpriseUser _EnterpriseUser;
public OrderService(IOrderRepo repo, EnterpriseUser enterpriseUser)
{
this._Repo = repo;
this._EnterpriseUser = enterpriseUser;
}
....
}
Информация о пользователе необходима для таких вещей, как, если они имеют определенный уровень привилегий, тогда их заказы могут быть помещены в очередь для рассмотрения администратором, или они могут получить скидку.
Моя проблема возникает с процессом аутентификации. EnterpriseUser
требует претензии от текущего IIdentity
.
builder.Register(ctx =>
{
// Identity extension to retrieve claim from User
var userLinkCode = ctx.Resolve<HttpContextBase>().User.Identity.GetUserLinkCode();
// Retrieves a header from the request
var partnerLinkCode = ctx.Resolve<ConnectionInfo>().PartnerLinkCode;
return EnterpriseUser.Create(userLinkCode, partnerLinkCode);
})
.As<EnterpriseUser>()
.InstancePerRequest();
Поэтому, когда срок действия токена пользователя истек, Autofac сгенерирует следующее исключение
Делегат, зарегистрированный для создания экземпляров LVV.Services.EnterpriseUser, вернул null
потому что заявки пустые и AuthorizeAttribute
никогда не сможет отклонить вызов с помощью 401 Unauthorized
, так как конструктор контроллера запускается до AuthorizeAttribute
.
Известно ли обойти это?
Возможно, способ отклонить вызов с помощью 401
, если делегат возвращает ноль?
Или лучший способ внедрить информацию о пользователе в сервисный уровень, в то же время позволяя функционировать процессу аутентификации OAuth.