Я обнаружил, что, по-видимому, является дефектом, вызывающим исключение 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
Мне кажется, что «контекст», который вы вводите, неверен. –
Если я правильно вас понимаю, Майкл, я не добавляю «контекст». То, что вы смотрите, является частью кода из библиотеки DotNetOpenAuth, полный источник которой связан выше. – shannon
Я думаю, он предполагал, что вы проходите неверный контекст. Можете ли вы показать код из метода Index LoginController? –