C# ApplicationDbContext的DefaultConnection字符串出现随机且不一致的错误
我的MVC应用程序中有一种奇怪的行为。在某个时候,我开始得到一个奇怪的C# ApplicationDbContext的DefaultConnection字符串出现随机且不一致的错误,c#,asp.net-mvc,entity-framework,authentication,connection-string,C#,Asp.net Mvc,Entity Framework,Authentication,Connection String,我的MVC应用程序中有一种奇怪的行为。在某个时候,我开始得到一个奇怪的初始化字符串格式,它不符合从索引0开始的规范。所有页面都出错 我说这是随机和不一致的,因为: 当没有对任何连接字符串进行任何更改时,它开始发生 大多数时候我在Firefox上都会出错 同时,它也适用于Chrome和IE 现在,我的发布配置文件添加了有问题的连接字符串,它如下所示: 当我删除这个连接字符串时,Firefox中的错误变为 建立与SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服
初始化字符串格式,它不符合从索引0开始的规范。
所有页面都出错
我说这是随机和不一致的,因为:
当我删除这个连接字符串时,Firefox中的错误变为
建立与SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。(提供程序:SQL网络接口,错误:26-定位指定的服务器/实例时出错)
(同样,它同时在Chrome和IE中工作)
通过“它可以工作”,我的意思是我可以使用我的域凭据登录到页面(应该使用AD身份验证)并浏览页面等
我的MVC应用程序应该只直接使用EF进行审计跟踪日志记录(可选地,存储在本地数据库中)。
为此,我设置了一个单独的DbContext类,该类指向一个特定的单独连接字符串——这一切都很好
“DefaultConnection”由样板OWIN身份验证代码使用的ApplicationDbContext使用:
public ApplicationDbContext():base(“DefaultConnection”,throwifvv1schema:false)
业务数据访问层被分离到一个不同的web API中,我在其中设置了适当的DbContext和连接字符串(也可以正常工作)
我的web应用的身份验证也在单独的web API中完成。我将HTTPS post中的凭据传递给API,使用PrincipalContext验证它们,并将声明集返回给web应用程序
在那里,我得到了一个IAAuthenticationManager的实例
this.HttpContext.GetOwinContext().Authentication
然后用我的索赔实例登录
this.AuthenticationManager.SignIn(新的AuthenticationProperties(){IsPersistent=rememberMe},标识)代码>
现在,有两个问题:
似乎我根本不需要ApplicationDbContext和使用它的位在我的应用程序中?我的意思是:
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext(ApplicationUserManager.Create);
app.CreatePerOwinContext(ApplicationSignInManager.Create)代码>
为什么它开始抛出错误,为什么它仍然在其他浏览器中工作
谢谢你的建议
==========================
更新
事实上,现在我在Chrome中也遇到了同样的错误,这让我认为这一定与我登录到该浏览器页面的时间有关。。。或者别的什么
因此,在清除cookies之后,我的页面在给定的浏览器中再次工作。什么。。。为什么?现在我知道了
原因是样板文件ConfigureAuth()方法中的“OnValidateIdentity”代码位
app.UseCookieAuthentication(新的CookieAuthenticationOptions
{
AuthenticationType=DefaultAuthenticationTypes.ApplicationOkie,
LoginPath=新路径字符串(“/Account/Login”),
Provider=新CookieAuthenticationProvider
{
//允许应用程序在用户登录时验证安全戳。
//这是一种安全功能,在您更改密码或向帐户添加外部登录时使用。
OnValidateIdentity=SecurityStampValidator.OnValidateIdentity(
validateInterval:TimeSpan.FromMinutes(30),
regenerateIdentity:(管理器,用户)=>user.GenerateUserIdentityAsync(管理器))
},
});
它试图在指定的时间间隔(30分钟)后调用身份验证。因此,在我登录30分钟后,它尝试验证身份,并因此调用了有问题的DbContext
它“有时起作用”以及我之所以称之为随机/不一致的原因是,我时不时地会清除cookie或尝试不同的浏览器,而这些浏览器不包含触发验证的cookie。然后,我会看到它工作,并且在相当长的一段时间内反复工作
原因是样板文件ConfigureAuth()方法中的“OnValidateIdentity”代码位
app.UseCookieAuthentication(新的CookieAuthenticationOptions
{
AuthenticationType=DefaultAuthenticationTypes.ApplicationOkie,
LoginPath=新路径字符串(“/Account/Login”),
Provider=新CookieAuthenticationProvider
{
//允许应用程序在用户登录时验证安全戳。
//这是一种安全功能,在您更改密码或向帐户添加外部登录时使用。
OnValidateIdentity=SecurityStampValidator.OnValidateIdentity(
validateInterval:TimeSpan.FromMinutes(30),
regenerateIdentity:(管理器,用户)=>user.GenerateUserIdentityAsync(管理器))
},
});
它试图在指定的时间间隔(30分钟)后调用身份验证。因此,在我登录30分钟后,它尝试验证身份,并因此调用了有问题的DbContext
原因
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, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
},
});