Azure 上的 AspNetIdentity 登录失败 - 初始化字符串的格式不符合从索引 0 开始的规范
Posted
技术标签:
【中文标题】Azure 上的 AspNetIdentity 登录失败 - 初始化字符串的格式不符合从索引 0 开始的规范【英文标题】:AspNetIdentity login fails on Azure - Format of the initialization string does not conform to specification starting at index 0 【发布时间】:2019-09-05 17:59:38 【问题描述】:免责声明:即使之前在很多主题中都提出过这个错误,我也没有找到我的问题的答案;请在标记为重复之前随时回答它,因为它不是重复的:-)
我在 ASP.NET MVC5 数据库第一个项目中使用Identity Framework。
我最近对我的解决方案进行了很多更改,包括在AspNetUsers
表中添加一列。我已经做了十几次了,一切正常。
当我使用 localhost 中的所有新更改测试我的解决方案时,一切正常,包括登录。
然后,我在托管在 Azure 上的 PreProd 环境中发布了我的代码和数据库更改(作为记录)
新的更改没问题,但是,当我尝试登录我的项目时,它失败了,我的日志中出现以下错误:
初始化字符串的格式不符合从索引 0 开始的规范。
问题出现在Login
HttpPost 方法中,仅在调用UserManager
时出现
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
try
//Just to proove I can access to my DB
var businessLayer = new businessLayer();
var dataFromDB = businessLayer.GetDataFromMyDB();
logger.Info(dataFromDB ); //dataFromDB is the expected value from my DB
logger.Info("Will call UserManager");
var user = await UserManager.FindByEmailAsync(model.Email.Trim()); // <- Fails here in PreProd only
logger.Info(I never go here (in PreProd only)");
catch(Exception ex)
//Fails here in PreProd only with above error message
logger.Error(ex, ex.Message);
在 localhost 中一切正常,在 preprod(托管在 Azure 中)中,调用 UserManager.FindByEmailAsync
时失败
这是我在本地主机中的 ConnectionString
<add name="MyEntities" connectionString="metadata=res://*/MyDataModel.csdl|res://*/MyDataModel.ssdl|res://*/MyDataModel.msl;provider=System.Data.SqlClient;provider connection string="data source=MY-PC\SQLEXPRESS;initial catalog=MyDBName3;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
这是我用于 Azure Preprod 的 ConnectionString
<add name="MyEntities" connectionString="metadata=res://*/MyDataModel.csdl|res://*/MyDataModel.ssdl|res://*/MyDataModel.msl;provider=System.Data.SqlClient;provider connection string="Server=tcp:xxxazure.database.windows.net,1433;Initial Catalog=MyDbName;Persist Security Info=False;User ID=MyUserID;Password=MyPassword;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;App=EntityFramework"" providerName="System.Data.EntityClient" />
当我在发布模式下使用 VisualStudio 中的 PreProd 连接字符串时,完全没有问题,我可以登录 (?!?!) 所以看来问题出在 PreProd 环境本身,不是吗?
到目前为止我已经尝试过:
直接在我的 FTP 中复制/粘贴 web.config 中的连接字符串 尝试将&quot;
更改为'
尝试删除连接字符串中除必需元素(用户 ID、密码..)之外的所有内容
Google my problem,点击首页的每一个链接,还是有我的问题
随机更改连接字符串中的Integrated Security
和其他bool值
在我的椅子上转 7 次,同时低声念咒语
谁能告诉我:
为什么它在 Azure 上托管时仅在 PreProd 中失败 如何更正?非常感谢
【问题讨论】:
【参考方案1】:只有几样东西可以试用:
如果您的代码中有如下连接字符串
<add name="Entities" connectionString="metadata=res://*/TestDB.csdl|res://*/TestDB.ssdl|res://*/TestDB.msl;provider=System.Data.SqlClient;provider connection string="Data Source=XXXXXXXX.database.windows.net,1433;Initial Catalog=YourDB;User ID=YourUser;Password=XXXXXX"" providerName="System.Data.EntityClient" />
将此添加到应用程序设置中的 azure 门户中:
Name Column => Entities
Value Column => metadata=res://*/TestDB.csdl|res://*/TestDB.ssdl|res://*/TestDB.msl;provider=System.Data.SqlClient;provider connection string="Data Source=XXXXXXXX.database.windows.net,1433;Initial Catalog=YourDB;User ID=YourUser;Password=XXXXXX"
"Custom" - In the drop selection box
请确保将 Azure 门户中的“更改为”。
从“普通”连接字符串转换为 EF 接受的连接字符串:
1) 应用程序设置中的连接字符串类型必须是“其他”而不是“SQL Azure”
2) 连接字符串值会自动替换 web.config 中发布的任何内容
尝试这些选项,看看是否有效。
【讨论】:
以上是关于Azure 上的 AspNetIdentity 登录失败 - 初始化字符串的格式不符合从索引 0 开始的规范的主要内容,如果未能解决你的问题,请参考以下文章
现有数据库上的 AspNet Identity ApplicationDbContext
Azure Active Directory 如何支持将 Okta 作为 IDP 进行联合?
通过 facebook ios SDK 结合 Azure 移动服务获取名字和姓氏
静态托管 - Azure Azure CDN上的Azure Blob存储上的ReactJS应用程序
使用不同租户上的 Azure Active Directory 访问 Azure Service Fabric 应用程序上的 Key Vault