为什么 [Owin] 在新项目上抛出 null 异常?

Why is [Owin] throwing a null exception on new project?

提问人:micah hawman 提问时间:10/13/2014 最后编辑:Olivier Jacot-Descombesmicah hawman 更新时间:1/30/2020 访问量:17307

问:

我有一个相当奇怪的问题,我不确定如何解决,或者我是否可以解决它。

我已经对这个问题进行了一些研究,但找不到导致它的原因的答案。

我正在遵循一个相当简单的指南 http://www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on

启用SSL并将控制器更改为需要https后,出现以下错误:

“/”应用程序中的服务器错误。

对象引用未设置为对象的实例。

说明:执行 当前 Web 请求。请查看堆栈跟踪以了解更多信息 有关错误及其在代码中的来源的信息。

异常详细信息:System.NullReferenceException:对象引用不是 设置为对象的实例。

源错误:

在执行期间生成了未处理的异常 当前 Web 请求。有关原产地和地点的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[NullReferenceException:对象引用未设置为 对象。
Microsoft.Owin.Security.Cookies.CookieAuthenticationProvider.Exception(CookieExceptionContext 上下文) +49
Microsoft.Owin.Security.Cookies.d__2.MoveNext() +3698 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (任务) 任务) +52 System.Runtime.CompilerServices.TaskAwaiter'1.GetResult() +24 Microsoft.Owin.Security.Infrastructure.d__0.MoveNext() +810 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (任务) 任务)+52 System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 Microsoft.Owin.Security.Infrastructure.d__0.MoveNext() +427 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (任务) 任务)+52 System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 Microsoft.AspNet.Identity.Owin.d__0.MoveNext() +641 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (任务) 任务)+52 System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 Microsoft.AspNet.Identity.Owin.d__0.MoveNext() +641 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (任务) 任务)+52 System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 Microsoft.AspNet.Identity.Owin.d__0.MoveNext() +641 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (任务) 任务)+52 System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__5.MoveNext() +287 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (任务) 任务)+52 System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__2.MoveNext() +272 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +22 Microsoft.Owin.Host.SystemWeb.Infrastructure.ErrorState.Rethrow() +33 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +150
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +42
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +415 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步) +155

版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.34237

关闭可以解决问题,我也知道注释掉 startup.auth 可以解决 上的问题。SSLapp_startSSL

有谁知道为什么会这样?

C# NullReferenceException OWIN

评论

1赞 Soner Gönül 10/13/2014
stackoverflow.com/questions/4660142/......
0赞 BrunoLM 10/13/2014
尝试在 Startup 方法中放置一个断点,并准确检查哪些行引发了此异常。
2赞 BrunoLM 10/13/2014
我从来没有见过这个,我真的没有任何想法,只是一个疯狂的想法......尝试清除您的 cookie,也许更改为 SSL 会更改 cookie 的某些内容,并且可能损坏了某些内容......只是一个疯狂的猜测......
2赞 Shouvik 11/15/2014
@micahhawman SSL 解密 如果它损坏了您的 cookie,owin 会尝试解密损坏的 cookie 并引发异常。这是有趣的部分,它不是让你控制对血腥的cookie做些什么,比如建立一个干净的路径,不试图解密附加到每个请求的frigging cookie,而是将你的浏览器重定向到一个URL,该URL会回传损坏的cookie,你在这里有一个循环。我喜欢称之为饼干怪物
3赞 Gina Marano 12/19/2014
这在 chrome 中发生在我身上,而不是 IE。会继续寻找...

答:

19赞 Sandeep Kumar 11/19/2014 #1

我遇到了类似的错误,但是当我将EF配置从DropCreateDatabaseIfModelChanges< Context>更改为DropCreateDatabaseAlways< Context>时。

我不确定您的错误原因,但这似乎是 Katana Project https://katanaproject.codeplex.com/workitem/346 中的一个问题

您可以在上面的链接或从 https://katanaproject.codeplex.com/discussions/565294 尝试解决方法

这就是我在StartUp.Auth.cs中所做的

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
           OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<UserManager, User>(
            validateInterval: TimeSpan.FromMinutes(1),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),

           //**** This what I did ***//
            OnException = context => { }
    }
});

评论

1赞 Dan Csharpster 8/9/2015
我不确定这个修复程序的内部工作原理,但它是救命稻草,谢谢!
1赞 urbanhusky 12/18/2015
这似乎只是抑制所有异常,以便它们不再传播。我不确定这是否是个好主意。
7赞 James 'Fluffy' Burton 12/11/2014 #2

我同意添加“OnException = context => {}”可以解决显示的异常,但是我刚才看到的下一个错误可能表明了一个常见原因,因此在此修复之前要尝试的第一步。

我现在有一个错误,通知我上下文支持的模型已更改。这可能意味着,尝试 Add-Migration 和 Update-Database 可能会为遇到此问题的其他 ASP.NET Identity 用户解决此问题,如果失败,请添加上面的行。这也表明,如果您看到此 Owin 安全异常,一些基本检查(如“我可以连接到数据库吗?”)也可能值得检查。一旦这个附属错误被修复,我就可以愉快地删除 OnException 行,并且该站点仍然正常工作。

0赞 Urik 12/19/2014 #3

我遇到了同样的问题,它之所以发生,是因为 SQL 数据库位于防火墙后面,每次更改时都需要添加本地 IP。

请参阅 Microsoft 的此链接,了解执行此操作的所有方法:

http://msdn.microsoft.com/en-us/library/azure/jj553530.aspx

0赞 megz 1/13/2015 #4

尝试从项目中删除迁移,一旦我为 Identity DB 启用数据库迁移,它就发生在我身上

删除整个迁移文件夹并重建后,问题消失了

它可能对你有用

2赞 Michal Ciechan 2/1/2015 #5

抛出此异常的原因可能是因为创建 .ApplicationDbContext

就我而言,我添加了迁移,并将

        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());

我开始遇到和你一样的错误。

事实证明,当我尝试访问数据库中的任何对象时,DbContext 会抛出一个错误,说已经存在,因为以前我在没有启用迁移的情况下运行了我的代码,因此创建了数据库,其中包含 Identity 所需的所有正确表,一旦我执行了 EnableMigrations,并设置了一个初始值设定项,它就会抛出一个错误,说表已经存在。AspNetUsers

在您的情况下,我的猜测是 ApplicationDbContext 存在一些潜在问题,在启动之前,请在调用 Config.Auth 方法之前尝试以下操作:

        var ctx = new ApplicationDbContext(...);
        var count = ctx.Users.Count();

查看它是否返回计数或引发异常。

2赞 brianbruff 2/6/2015 #6

是的,我遇到了同样的问题,我从Azure下载了一个数据库。 然后我更改我的应用程序以使用它 我的应用有一个新字段,该字段在 Azure 备份中不存在 迁移不同步。

Update-Database(在启用了迁移的包管理中)做到了这一点。

34赞 Ben Cull 2/7/2015 #7

与 Sandeep 的回答类似,我也更新了 cookie 身份验证提供程序。除了,我没有吞下错误,而是抛出了异常,这样你就可以看到潜在的问题是什么:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, User>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),

            /* I changed this part */
            OnException = (context =>
            {
                throw context.Exception;
            })
    }                
});

对我来说,根本问题是我更改了模型,忘记了添加新的迁移。

评论

1赞 Bart Calixto 2/13/2015
这不仅是我完全相同的问题,而且代码真的很有用!OnException
0赞 EJay 2/26/2015
如果我能<3,我会吻你,我什至不知道这为我节省了多少时间。干杯!
0赞 Macke 8/17/2015
你的最后一段为我钉住了。合并一些更改时,我忘记运行“Update-Database”。
0赞 Ricker Silva 11/23/2015
当我读到你的问题是没有数据库更新的模型更改时,我意识到我做到了。我认为在以前的版本中,这些错误会对数据库版本控制发出警告。我忘了创建迁移和更新 datbase,这样做了,一切都会再次运行。
0赞 dviljoen 2/9/2018
我的 CookieAuthenticationProvider 版本不公开 OnException。有人知道为什么吗?
0赞 Leon 3/3/2015 #8

清除 OWIN cookie 在我的情况下有效。

0赞 devMomentum 3/29/2015 #9

在阅读了一些答案后,尝试在 IE 而不是 Chrome 中并且没有看到崩溃,我只是关闭了 Chrome 并重新启动了应用程序。

1赞 Dan Csharpster 5/10/2015 #10

这些答案似乎都很有帮助,并表明了数据库搞砸的趋势。我遇到这个问题是因为我更新了我的模型并且没有更新数据库。现在,每次更改模型时,在尝试调试我的站点之前,我都会手动调用Add-Migration和Update-Database,而我忘记了该步骤。

1赞 Omid.Hanjani 5/19/2015 #11

清除 localhost Cookie。如果使用 Firefox,请参阅此链接。我有完全相同的错误和这里的解决方案。

4赞 BurnOut 6/13/2015 #12

我也遇到了这个问题,并通过清除cookie解决了它。

您的cookie似乎无效。

2赞 CMS 7/10/2015 #13

包管理器控制台中的 Update-Database 为我做了伎俩

10赞 Patrick Borkowicz 7/15/2015 #14

创建新项目后运行以下更新对我有用:

更新包 Microsoft.Owin

更新包 Microsoft.Owin.Security

更新包 Microsoft.Owin.Security.Cookies

我认为最后一个可能已经足够了。 我正在使用 Visual Studio 2013 (12.0.21005.1) 和带有 Web API 的 ASP.Net Web 应用程序模板。

评论

2赞 Mike Upjohn 10/7/2015
最高分,谢谢!我刚刚更新了最后一个,它运行良好。从版本 3.0.0 到版本 3.0.1。
0赞 Gabriela Macias 5/7/2016 #15

我错过了在表 [AspNetRoles] 中添加角色。这解决了问题。

0赞 svyat1s 1/12/2020 #16

原因也可能在于用于编译和运行应用程序的 .Net Framework 版本的差异。只需在 web.config 中显式指定版本:

<httpRuntime ...... targetFramework="4.6.1" />
<compilation ...... targetFramework="4.6.1" />