0

我在我的 ASP.NET MVC 应用程序中找到了导致 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为空。这是该失败方法的DotNetOpenAuth.AspNet库源

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

User自从 IIS 集成模式可用以来,显然已经可以为空。这解释了为什么我在开发中看不到它,因为我正在使用默认值运行 IIS Express,但它没有解释为什么我找不到有关该缺陷的任何信息。集成模式于 2007 年发布,DotNetOpenAuth 仍在维护。Microsoft 文档对设置进行了说明:

经典模式:仅当应用程序池中的应用程序无法在集成模式下运行时才使用此模式。

我一定遗漏了一些东西,因为似乎每个人都应该有这个问题。

我是否以某种方式 NuGet 了一个非维护的库?这似乎很奇怪,因为它显示它是一周前刚刚更新的。但是,当我按照 NuGet 的文档链接进行操作时,我得到的源代码似乎甚至没有一个 AspNet 命名空间,我的异常就出现在这里。

编辑:我目前使用的唯一相关包是DotNetOpenAuth.AspNet(它有 8 个依赖项),最后一次发布不到一周前。我也尝试过其他软件包。我不需要SimpleAuth或任何 WebMatrix 爵士乐。在解决这个问题的过程中,我尝试按照http://techblog.dorogin.com/2013/06/Microsoft.AspNet.WebPages.OAuth.html的描述切换库

编辑:记录了与此相关的缺陷,但似乎该库可能无法维护。https://github.com/DotNetOpenAuth/DotNetOpenAuth/issues/317#issuecomment-29580565

编辑:等待堆栈跟踪,它可能与MVC 5 Owin Facebook Auth 的缺陷相同,导致空引用异常

4

1 回答 1

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;
}

当然可以。

于 2013-12-02T20:31:39.720 回答