0

我正在对托管在服务器上的 Web api 使用基本身份验证。它在我的本地使用基本身份验证工作正常。但是当我将它托管到服务器时,它会导致以下错误

* {"Message":"发生错误。","ExceptionMessage":"建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。未找到或无法访问服务器。验证实例名称正确,并且 SQL Server 配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL 的连接 *

当我删除基本身份验证时,它也可以在服务器上正常工作。

我的连接字符串

<connectionStrings>
<add name="DefaultConnection" connectionString="Password=password;Persist Security Info=True;User ID=wbuser;Initial Catalog=WinBouts_com;Data Source=WINBOUTSAPIVM"
  providerName="System.Data.SqlClient" />
<add name="WinBoutsConnectionString" connectionString="Password=password;Persist Security Info=True;User ID=wbuser;Initial Catalog=WinBouts_com;Data Source=WINBOUTSAPIVM"
  providerName="System.Data.SqlClient" />    

我正在使用 system.web.providers 进行基本身份验证,所以我在我的 web.config 中找到了这个

<!--
        If you are deploying to a cloud environment that has multiple web server instances,
        you should change session state mode from "InProc" to "Custom". In addition,
        change the connection string named "DefaultConnection" to connect to an instance
        of SQL Server (including SQL Azure and SQL  Compact) instead of to SQL Server Express.
  -->
<sessionState mode="Custom" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="WinBoutsConnectionString" />
  </providers>
</sessionState>

我确实将模式更改为自定义,我想我的连接字符串连接到 sql server 而不是 sql server express?我不确定!

有趣的是,它在 connectionStringName 处显示一个错误,说“不允许使用该属性”?但是在我的本地虚拟机中,它不会抛出任何这样的错误,这就是我猜基本身份验证在我的本地虚拟机上运行良好。

谁能告诉我哪里可能出错了。任何建议都将不胜感激。我整天都在为此头疼:(

4

1 回答 1

0

终于解决了问题。问题出在我的基本身份验证过滤器类中。

private bool TryGetPrincipal(string username, string password, out IPrincipal principal)
    {      string connectionString = ConfigurationManager.ConnectionStrings["WinBoutsConnectionString"].ConnectionString;    

        username = username.Trim();
        password = password.Trim();

        //only supporting SSO login atm
       // var valid = Membership.Provider.ValidateUser(username, password);
        serviceContext = new WinBoutsDataContext<DataAccess.Model.UserInfo>(connectionString);
        userRepository = new UserRepository(serviceContext);

        var valid = this.userRepository.ValidateAccount(username, password);

        if (valid)
        {
            // once the user is verified, assign it to an IPrincipal with the identity name and applicable roles
            principal = new GenericPrincipal(new GenericIdentity(username), System.Web.Security.Roles.GetRolesForUser(username));
            return true;
        }

        //user wasn't found, unauthorised
        principal = null;
        return false;
    }

我在这里对我的 DataContext 进行了硬编码,但之前我没有将连接字符串传递给它。我只是选择了 WinBoutsDataContext 的默认构造函数,当我将代码放到服务器上时它不起作用。

于 2012-11-27T08:54:59.570 回答