0

サーバーでホストされている Web API に基本認証を使用しています。基本認証を使用して、ローカルで正常に動作します。しかし、サーバーにホストすると、次のエラーが発生します

* {"メッセージ":"エラーが発生しました。","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 Express ではなく SQL Server に接続されていると思いますか?? それについてはわかりません!

そして興味深いことに、「属性は許可されていません」というエラーが connectionStringName に表示されますか? しかし、私のローカル VM では、そのようなエラーはスローされず、ローカル VM で基本認証が正常に機能していると思います。

どこが間違っているのか教えてください。どんな提案でも大歓迎です。私は一日中それについて頭を叩いています:(

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 に答える