2

データベースに Sql Server 2008 を使用する ASP.Net 3.5 (C#) Web アプリケーションがあります。そのデータベースには、ユーザー名/パスワードの列を持つ標準ユーザーテーブルがあり、ユーザーを認証するための簡単なログインフォームがあります。ログインページは単純に、入力された値に一致するユーザー名とパスワードの組み合わせをテーブルに照会します。ユーザーが有効なユーザー名/パスワードを入力すると、正常に機能して続行しますが、何らかの理由で無効な組み合わせがあった場合は、単に一致するものを見つけるのではなく、エラーをスローします。エラーは次のとおりです。

System.Web メッセージ: タイプ 'System.Web.HttpUnhandledException' の例外がスローされました。スタック トレース: System.Web.UI.Page.HandleError(Exception e) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) ) c:\Windows\Microsoft.NET\Framework64\v2 の ASP.login_aspx.ProcessRequest(HttpContext コンテキスト) で System.Web.UI.Page.ProcessRequest() で System.Web.UI.Page.ProcessRequest(HttpContext コンテキスト) で.0.50727\Temporary ASP.NET Files\root\55c40ade\918a8ce7\App_Web_xyhtxem7.17.cs:System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() の行 0 System.Web.HttpApplication. ExecuteStep(IExecutionStep ステップ、Boolean& completedSynchronously) 完全なエラー テキスト: System.Web.HttpUnhandledException: 'System.Web.HttpUnhandledException' 型の例外がスローされました。---> System.Data.SqlClient.SqlException: ユーザー インスタンスのプロセスの開始に失敗したため、SQL Server のユーザー インスタンスを生成できませんでした。接続が閉じられます。System.Data.SqlClient.SqlInternalConnection.OnError (SqlException 例外、ブール型 breakConnection) で System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj) で System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior、SqlCommand cmdHandler、SqlDataReader dataStream) で、BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj) で System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) で System.

何が起こっているのですか?

4

4 に答える 4

0

確かな情報を提供していないため、これは推測です。

独自のプロバイダーを作成したか、何らかの方法で回避しようとしているようです。

ログインに失敗すると、web.config にまだ接続文字列がある既定のプロバイダーにコードが自動的にフォールバックしているように見えます。おそらく、ビジュアルスタジオが「役立つ」ように追加するデフォルトの接続文字列です。これは mdf であり、mdf が存在しない場合にスローされるエラーです。

そのデータベースは明らかに存在せず、そのエラーで失敗しています。

そのため、おそらく web.config でプロバイダーを削除するか、独自のプロバイダーを修正するか、ユーザーを検証する方法を修正する必要があります。

于 2013-01-11T10:27:51.183 に答える
0

ここで問題を発見しました。私は自分のアプリケーションにメンバーシップ プロバイダーを使用していませんでした (または少なくとも使用しようとしていました) が、ログイン ページに組み込みのログイン コントロールを使用していました。送信ボタンの OnClick イベントを処理していましたが、有効な資格情報では正常に動作し、リダイレクトされましたが、無効な場合はリダイレクトされませんでした。Login.Authenticate イベントがトリガーされたが処理されなかったため、これが問題の原因であると考えています。コードを作り直し、Login コントロールの代わりに独自の送信フォームを使用することで、問題なく動作しました。

于 2013-01-14T09:31:33.840 に答える
0

メンバーシップ プロバイダーを使用して SQL サーバーに接続しようとしています。おそらく、データベース ファイル名を指定して、ローカルの SQL Express インスタンスを使用しようとしていると思います。
このような場合、プロバイダーは、データベースが存在しない場合にデータベースを作成しようとし、アカウント (コードが実行されているアカウント) にフォルダーに対する読み取り/書き込みアクセス許可が必要になる場合があります。または、マシンに sqlexpress がインストールされていない場合などもあります。

接続文字列を確認し、そこからデバッグを試みることをお勧めします。たとえば、そのデータベース (リモート/ローカル) に接続するか、存在しない場合はそのデータベースを (必要なスキーマと共に) 作成してみてください。接続文字列を(ファイル名を提供する代わりに)従来のものに変更するなど...

メンバーシップ プロバイダーに必要なデータベースとスキーマの作成に関する詳細については、次の記事を参照してください。 -cs

于 2013-01-11T10:41:45.657 に答える
0

一致しない場合、SQL の結果はおそらく NULL です。したがって、メソッドの有効な結果は得られません。このようなことをすると

SELECT * FROM xxx WHERE username = {0} and password = {1}

試す

SELECT COUNT(*) FROM xxx WHERE username = {0} and password = {1}

次に、int 値 0 または >0 を取得して検証します。しかし、より具体的にするのに役立つコードを示してください。

于 2013-01-11T10:14:30.127 に答える