为什么[Owin]在新项目上抛出空例外?

时间:2014-10-12 16:04:09

标签: c# nullreferenceexception owin

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

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

我在http://www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on

处遵循了一个相当简单的指南

在启用 SSL 并将 controller 更改为要求https后,我收到以下错误:

  

' /'中的服务器错误应用

     

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

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

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

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[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(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(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(Task   任务)+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 step,Boolean& completedSynchronously)+155

     

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

关闭SSL修复此问题,我也知道在startup.auth中评论 app_start 修复了SSL上的问题。< / p>

有谁知道为什么会这样?

15 个答案:

答案 0 :(得分:33)

与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 :(得分:19)

我遇到了类似的错误,但是当我从DropCreateDatabaseIfModelChanges&lt;更改EF配置时语境GT; DropCreateDatabaseAlways&lt;上下文取代。

我不确定您的错误原因但似乎是Katana项目中的一个问题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 => { }
    }
});

答案 2 :(得分:7)

我同意添加&#34; OnException = context =&gt; {}&#34;解决了显示的异常,但我刚才看到的下一个错误可能是一个常见原因,因此在此修复之前尝试了第一步。

我现在有一个错误,告诉我上下文的模型支持已经改变。这可能意味着尝试添加迁移和更新数据库可以为遇到此问题的其他ASP.NET身份用户解决此问题,如果失败则添加上面的行。这也会建议一些基本的检查,例如&#34;我可以连接到数据库吗?&#34;如果您看到此Owin Security异常,也可能值得检查。一旦这个子序列错误得到修复,我可以愉快地删除OnException行,并且该站点仍然正常工作。

答案 3 :(得分:4)

我也有这个问题,并通过清除cookie来解决它。

您的Cookie似乎无效。

答案 4 :(得分:2)

可能引发此异常的原因是因为创建ApplicationDbContext时出现问题。

在我的情况下,我添加了迁移,并设置

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

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

当我尝试访问数据库中的任何对象时,DbContext抛出了一个错误,说AspNetUsers已经存在,因为之前我已经运行了我的代码而没有启用迁移,因此创建了数据库, Identity所需的所有正确表格,一旦我执行了EnableMigrations,并设置了初始化程序,就会抛出错误,表明该表已经存在。

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

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

查看它是返回计数还是抛出异常。

答案 5 :(得分:2)

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

更新 - 数据库(在启用迁移的软件包管理中)完成了这一操作。

答案 6 :(得分:2)

更新 - 包管理器控制台中的数据库 为我做了诀窍

答案 7 :(得分:1)

这些答案似乎都很有帮助,并指出了数据库混乱的趋势。我遇到了这个问题,因为我更新了我的模型并且没有更新数据库。现在我每次更改模型时都会手动调用Add-Migration和Update-Database,在我尝试调试我的网站之前,我已经忘记了这一步。

答案 8 :(得分:1)

清除localhost cookie。如果使用firefox,请参阅此link。我完全有同样的错误,这个解决方案here

答案 9 :(得分:0)

我遇到了同样的问题,因为SQL数据库位于防火墙之后,您需要在每次更改时添加本地IP。

请参阅Microsoft的链接以了解所有这些方法:

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

答案 10 :(得分:0)

尝试从项目中删除迁移

一旦我为Identity DB启用了数据库迁移,我就和我在一起

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

它可能适合你

答案 11 :(得分:0)

在我的案例中清除OWIN cookie。

答案 12 :(得分:0)

在阅读了一些答案后,尝试使用IE而不是Chrome,并且没有崩溃,我只是关闭了Chrome并重新启动了应用。它奏效了。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

原因还可能是因为用于编译和运行应用程序的.Net Framework版本不同。只需在web.config中明确指定版本:

return