Cookies owin cokies ASP.NET MVC 5的Nullreference异常
我对owin cokies有意见。我们有一个由ASP.NETMVC5支持的站点。通过owin中间件进行授权。有时用户会得到一个白色屏幕,错误为500。我不能在本地复制它,但有几次我可以在生产中复制这个案例。在浏览日志时,我发现错误“System.NullReferenceException:对象引用未设置为对象的实例。” 堆栈: System.NullReferenceException:对象引用未设置为对象的实例。 位于Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer.Write(BinaryWriter-writer,AuthenticationTicket模型) 位于Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer.Serialize(AuthenticationTicket模型) 在Microsoft.Owin.Security.DataHandler.SecureDataFormatCookies owin cokies ASP.NET MVC 5的Nullreference异常,cookies,oauth,asp.net-mvc-5,authorization,owin-middleware,Cookies,Oauth,Asp.net Mvc 5,Authorization,Owin Middleware,我对owin cokies有意见。我们有一个由ASP.NETMVC5支持的站点。通过owin中间件进行授权。有时用户会得到一个白色屏幕,错误为500。我不能在本地复制它,但有几次我可以在生产中复制这个案例。在浏览日志时,我发现错误“System.NullReferenceException:对象引用未设置为对象的实例。” 堆栈: System.NullReferenceException:对象引用未设置为对象的实例。 位于Microsoft.Owin.Security.DataHandler.S
1.Protect(TData数据)中
在Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler。。但我认为这是徒劳的,因为我有OWIN的最新版本:
Microsoft.AspNet.Identity.Owin:2.2.1
Microsoft.Owin:3.1.0
Microsoft.Owin.Security.OAuth:3.1.0
Microsoft.Owin.Security.Cookies:3.1.0
然而,Owin.Security.Providers是1.27.0版本,因为我们不需要很多提供商(只有facebook和linkedin)
这是一个遗留项目,所以我没有深入研究
我需要一些帮助。
谢谢。看起来这是AspNetKatana问题,有关更多详细信息,请参阅
被拒绝的身份仍然会创建一个AuthTicket而没有
校长。如果在同一请求上尝试滑动刷新
然后,它将重新考虑失踪的校长
你提到你有时可以在制作中复制这个。如果你能告诉我你做了什么来繁殖的话,这可能会有所帮助。就像你删除Cookie一样?我打开了两个不同的浏览器(或者在Chrome中打开了Incognito)并通过第一个浏览器登录,然后在几分钟后通过第二个浏览器登录,在第二个浏览器上我登录了,然后重复了七次。有时我会重复很长时间,很难重现这个错误@鲁阿尔德瓦内堡
app.CreatePerOwinContext(Entities.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
//owin иногда теряет куки авторизации в response, поэтому потом возникается nullreference error
//здесь вызывается специальная библиотека, которая сохраняет куки авторизации (создана для фикса бага овина)
app.UseKentorOwinCookieSaver();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/newLogin"),
LogoutPath = new PathString("/logout"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = ctx =>
{
var ret = Task.Run(async () =>
{
Claim claim = null;
int userId = default(int);
User user = null;
try
{
claim = ctx.Identity.FindFirst("SecurityStamp");
if (claim == null) return;
var userManager = new ApplicationUserManager(DependencyResolver.Current.GetService<IUserStore<User, int>>());
userId = ctx.Identity.GetUserId<int>();
user = await userManager.FindByIdAsync(userId);
if (user != null && user.SecurityStamp != null && user.SecurityStamp != claim.Value)
{
var exc = new Exception("ConfigureAuth->OnValidateIdentity->Reject");
exc.Data.Add("claim", claim.Value);
exc.Data.Add("userId", userId);
exc.Data.Add("userStamp", user.SecurityStamp);
ErrorStore.LogException(exc, HttpContext.Current);
ctx.RejectIdentity();
}
}
catch (Exception ex)
{
var exc = new Exception("ConfigureAuth->OnValidateIdentity->catch", ex);
if (claim != null)
{
exc.Data.Add("claim", claim.Value);
}
exc.Data.Add("userId", userId);
if (user!=null)
{
exc.Data.Add("userStamp", user.SecurityStamp);
}
ErrorStore.LogException(exc, HttpContext.Current);
ctx.RejectIdentity();
return;
}
});
return ret;
},
OnApplyRedirect = ctx =>
{
if (!IsApiRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
},
OnException = (context =>
{
ErrorStore.LogException(context.Exception, HttpContext.Current);
return;
})
}
});