首页 > 解决方案 > Azure 上的 AspNetIdentity 登录失败 - 初始化字符串的格式不符合从索引 0 开始的规范

问题描述

免责声明:即使以前在很多主题中都提出过这个错误,我也没有找到我的问题的答案;请在标记为重复之前随时回答它,因为它不是重复的:-)


我在 ASP.NET MVC5 数据库的第一个项目中使用Identity Framework 。

我最近对我的解决方案进行了很多更改,包括在表格中添加一列AspNetUsers。我已经这样做了十几次,一切正常。

当我使用 localhost 中的所有新更改测试我的解决方案时,一切正常,包括 login

然后,我在 Azure 上托管的 PreProd 环境中发布了我的代码和数据库更改(作为记录)

新的更改没问题,但是,当我尝试登录我的项目时,它失败了,并且我的日志中有以下错误:

初始化字符串的格式不符合从索引 0 开始的规范。

问题发生在LoginHttpPost 方法中,仅在调用时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=&quot;data source=MY-PC\SQLEXPRESS;initial catalog=MyDBName3;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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=&quot;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&quot;" providerName="System.Data.EntityClient" />

当我在发布模式下使用 VisualStudio 中的 PreProd 连接字符串时,完全没有问题,我可以登录(?!?!) 所以看起来问题出在 PreProd 环境本身,不是吗?

到目前为止我已经尝试过:

谁能告诉我:

太感谢了

标签: c#azureasp.net-identityconnection-stringusermanager

解决方案


只需尝试几件事:

如果您的代码中有如下连接字符串

<add name="Entities" connectionString="metadata=res://*/TestDB.csdl|res://*/TestDB.ssdl|res://*/TestDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=XXXXXXXX.database.windows.net,1433;Initial Catalog=YourDB;User ID=YourUser;Password=XXXXXX&quot;" 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 中发布的任何内容

尝试这些选项,看看它是否有效。


推荐阅读