@BloodyBlade

Почему при попытке получить AuthenticationManager через OwinContext падает NullReference?

Всем привет! При работе с asp.net identity столкнулся с проблемой. Перенес работу с asp.net identity из asp.net mvc проекта (UI) в отдельный проект (BLL), создал поле для получения authenticationManager'а:
private IAuthenticationManager autenhticationManager => HttpContext.Current.GetOwinContext().Authentication;

В дальнейшем использую его для получения информации о текущем пользователе.
Локально все работает отлично, аутентификация проходит, но после публикации на хостинг при попытке аутентифицироваться все падает, в логи падают следующие сообщения:
2017/05/12 20:05:35.385 | Fatal | System.NullReferenceException: Object reference not set to an instance of an object.
at System.Web.HttpContextExtensions.GetOwinEnvironment(HttpContext context)
at System.Web.HttpContextExtensions.GetOwinContext(HttpContext context)
at BusinessLogic.Service.UsersService.get_authenticationManager()
2017/05/12 20:05:35.479 | Fatal | System.NullReferenceException: Object reference not set to an instance of an object.
at BusinessLogic.Service.UsersService.get_authenticationManager()
at BusinessLogic.Service.UsersService.d__20.MoveNext()
--- End of stack trace from previous location where exception was thrown ---

По всей видимости OwinContext возвращает null, но почему я понять не могу.
Думал, что это связано с тем, что файл Sturtup находится в проекте UI, но после переноса его в BLL ничего не изменилось.
Все перерыл, не нашел ничего, что мне бы помогло. Возможно кто-то сталкивался с такой проблемой? Буду рад любой помощи или наводке, заранее спасибо!
  • Вопрос задан
  • 257 просмотров
Пригласить эксперта
Ответы на вопрос 1
@pro100gram
Программист-фрилансер
нужно сконфигурировать Owin таким образом (зависит от реализации класса AuthenticationManager):

[assembly: OwinStartup(typeof(YourAppName.App_Start.Startup))]
namespace YourAppName.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.CreatePerOwinContext<EF_DbContext>(EF_DbContext.Create);
            ...
            app.CreatePerOwinContext<AuthenticationManager>(AuthenticationManager.Create);
            ...
        }
    }
}


В этом случае в AuthenticationManager должен быть реализован метод Create, таким образом:

public static AuthenticationManager Create(IdentityFactoryOptions<AuthenticationManager> options, IOwinContext context)
{
    var manager = new AuthenticationManager(context.Get<EF_DbContext>());
    return manager;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы