提问人:micah hawman 提问时间:10/13/2014 最后编辑:Olivier Jacot-Descombesmicah hawman 更新时间:1/30/2020 访问量:17307
为什么 [Owin] 在新项目上抛出 null 异常?
Why is [Owin] throwing a null exception on new project?
问:
我有一个相当奇怪的问题,我不确定如何解决,或者我是否可以解决它。
我已经对这个问题进行了一些研究,但找不到导致它的原因的答案。
我正在遵循一个相当简单的指南 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
可以解决 上的问题。SSL
app_start
SSL
有谁知道为什么会这样?
答:
我遇到了类似的错误,但是当我将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 => { }
}
});
评论
我同意添加“OnException = context => {}”可以解决显示的异常,但是我刚才看到的下一个错误可能表明了一个常见原因,因此在此修复之前要尝试的第一步。
我现在有一个错误,通知我上下文支持的模型已更改。这可能意味着,尝试 Add-Migration 和 Update-Database 可能会为遇到此问题的其他 ASP.NET Identity 用户解决此问题,如果失败,请添加上面的行。这也表明,如果您看到此 Owin 安全异常,一些基本检查(如“我可以连接到数据库吗?”)也可能值得检查。一旦这个附属错误被修复,我就可以愉快地删除 OnException 行,并且该站点仍然正常工作。
我遇到了同样的问题,它之所以发生,是因为 SQL 数据库位于防火墙后面,每次更改时都需要添加本地 IP。
请参阅 Microsoft 的此链接,了解执行此操作的所有方法:
http://msdn.microsoft.com/en-us/library/azure/jj553530.aspx
尝试从项目中删除迁移,一旦我为 Identity DB 启用数据库迁移,它就发生在我身上
删除整个迁移文件夹并重建后,问题消失了
它可能对你有用
抛出此异常的原因可能是因为创建 .ApplicationDbContext
就我而言,我添加了迁移,并将
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());
我开始遇到和你一样的错误。
事实证明,当我尝试访问数据库中的任何对象时,DbContext 会抛出一个错误,说已经存在,因为以前我在没有启用迁移的情况下运行了我的代码,因此创建了数据库,其中包含 Identity 所需的所有正确表,一旦我执行了 EnableMigrations,并设置了一个初始值设定项,它就会抛出一个错误,说表已经存在。AspNetUsers
在您的情况下,我的猜测是 ApplicationDbContext 存在一些潜在问题,在启动之前,请在调用 Config.Auth 方法之前尝试以下操作:
var ctx = new ApplicationDbContext(...);
var count = ctx.Users.Count();
查看它是否返回计数或引发异常。
是的,我遇到了同样的问题,我从Azure下载了一个数据库。 然后我更改我的应用程序以使用它 我的应用有一个新字段,该字段在 Azure 备份中不存在 迁移不同步。
Update-Database(在启用了迁移的包管理中)做到了这一点。
与 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;
})
}
});
对我来说,根本问题是我更改了模型,忘记了添加新的迁移。
评论
OnException
清除 OWIN cookie 在我的情况下有效。
在阅读了一些答案后,尝试在 IE 而不是 Chrome 中并且没有看到崩溃,我只是关闭了 Chrome 并重新启动了应用程序。
这些答案似乎都很有帮助,并表明了数据库搞砸的趋势。我遇到这个问题是因为我更新了我的模型并且没有更新数据库。现在,每次更改模型时,在尝试调试我的站点之前,我都会手动调用Add-Migration和Update-Database,而我忘记了该步骤。
清除 localhost Cookie。如果使用 Firefox,请参阅此链接。我有完全相同的错误和这里的解决方案。
我也遇到了这个问题,并通过清除cookie解决了它。
您的cookie似乎无效。
包管理器控制台中的 Update-Database 为我做了伎俩
创建新项目后运行以下更新对我有用:
更新包 Microsoft.Owin
更新包 Microsoft.Owin.Security
更新包 Microsoft.Owin.Security.Cookies
我认为最后一个可能已经足够了。 我正在使用 Visual Studio 2013 (12.0.21005.1) 和带有 Web API 的 ASP.Net Web 应用程序模板。
评论
我错过了在表 [AspNetRoles] 中添加角色。这解决了问题。
原因也可能在于用于编译和运行应用程序的 .Net Framework 版本的差异。只需在 web.config 中显式指定版本:
<httpRuntime ...... targetFramework="4.6.1" />
<compilation ...... targetFramework="4.6.1" />
评论