0

Я обнаружил, что, по-видимому, является дефектом, вызывающим исключение NullReferenceException в моем приложении ASP.NET MVC. Разрушил ли я это, или должен ли это перерыв DotNetOpenAuth для большинства установок?NullReferenceException в DotNetOpenAuth

я получаю это:

[NullReferenceException: Object reference not set to an instance of an object.] 
    DotNetOpenAuth.AspNet.OpenAuthSecurityManager.GetUsername(HttpContextBase context) +27 
    DotNetOpenAuth.AspNet.OpenAuthSecurityManager.RequestAuthentication(String returnUrl) +341 
    Controllers.LoginController.Index() +226 

Вот Index() метод. Обратите внимание, что он в настоящее время возвращает Пользователь в производстве и OK в разработке. Очевидно, что они временны. Прокомментированный код относится к последнему URL, на который я ссылался ниже, где я уменьшил количество кода между мной и проблемой. Тем не менее трассировка стека все же была сходна. возникает

public virtual ActionResult Index() 
{ 
    if (HttpContext == null) return Content("HttpContext"); 
    if (HttpContext.User == null) return Content("User"); 
    if (HttpContext.User.Identity == null) return Content("Identity"); 
    return Content("OK"); 
    new OpenAuthSecurityManager(HttpContext, s_fbClient, OAuthDataProvider.Instance) 
     .RequestAuthentication(Url.Action(Actions.Callback())); 
    // OAuthWebSecurity 
    // .RequestAuthentication("facebook", Url.Action(Actions.Callback())); 
    return null; 
} 

Исключение, потому что HttpContext.User является недействительным. Here's the DotNetOpenAuth.AspNet library source для этого неисправный способ.

private static string GetUsername(HttpContextBase context) { 
    string username = null; 
     if (context.User.Identity.IsAuthenticated) { 
      username = context.User.Identity.Name; 
     } 
    return username ?? string.Empty; 
} 

User имеет, видимо, имеет been nullable ever since IIS Integrated Mode was available. Это объясняет, почему я не вижу его в разработке, поскольку я запускаю IIS Express с настройками по умолчанию, но это не объясняет, почему я не могу найти никакой информации о дефекте. Интегрированный режим был выпущен в 2007 году, а DotNetOpenAuth все еще поддерживается. документы Microsoft сказать о настройке:

Классический режим: Используйте этот режим только тогда, когда приложения в пуле приложений не может работать в интегрированном режиме.

Должно быть, мне что-то не хватает, потому что кажется, что каждый должен иметь эту проблему.

Неужели у меня NuGet'ed не поддерживаемая библиотека? Кажется странным, поскольку он показывает, что он был обновлен неделю назад. Но когда я следую ссылке документации из NuGet, the source code I arrive at, похоже, даже не имеет пространства имен AspNet, где возникло мое исключение.

EDIT: Единственный связанный пакет, который я использую, в настоящее время DotNetOpenAuth.AspNet (и он имеет 8 зависимостей), последний раз опубликованный менее недели назад. Я также пробовал другие пакеты. Мне не нужен SimpleAuth или любой джаз WebMatrix. В процессе решения этого вопроса я попытался перевести библиотеки, как описано http://techblog.dorogin.com/2013/06/Microsoft.AspNet.WebPages.OAuth.html

EDIT: Записан дефект, связанный с этим, но, похоже, эта библиотека может не поддерживаться. https://github.com/DotNetOpenAuth/DotNetOpenAuth/issues/317#issuecomment-29580565

EDIT: В ожидании трассировки стека, она может быть такой же, как дефект MVC 5 Owin Facebook Auth results in Null Reference Exception

+0

Мне кажется, что «контекст», который вы вводите, неверен. –

+0

Если я правильно вас понимаю, Майкл, я не добавляю «контекст». То, что вы смотрите, является частью кода из библиотеки DotNetOpenAuth, полный источник которой связан выше. – shannon

+0

Я думаю, он предполагал, что вы проходите неверный контекст. Можете ли вы показать код из метода Index LoginController? –

ответ

0

Это действительно дефект в коде DotNetOpenAuth.AspNet. К сожалению, библиотека DotNetOpenAuth больше не поддерживается. Изменение источника с помощью:

private static string GetUsername(HttpContextBase context) { 
    string username = null; 
     if (context.User != null && context.User.Identity.IsAuthenticated) { 
      username = context.User.Identity.Name; 
     } 
    return username ?? string.Empty; 
} 

Конечно, трюк.