トップ回答者
サーバーエラーについてご教示下さい。

質問
-
こんにちわ。
いつも大変お世話になっております。
VS2005にてアプリケーションを作成して
「WEBサイトの発行」でWEBサーバー上にアプリケーションを発行しました。
そのアプリケーションをサーバー上で実行した所、以下のエラーが出ました。
--------------------------------------------------------
構成にエラーがあります。
パーサーエラーメッセージ:アプリケーションレベルを超えて allowDefinition='MachineToApplication'として登録されているセクションを使うことはできません。このエラーは、仮想ディレクトリがIISでアプリケーションとして構成されなかった場合に発生します。
ソースエラー:
行24: を有効にします。
行25:-->
行26: <authentication mode="Forms">
行27: <forms name="formauth" loginurl="Login.aspx"
行28: <protection="All" path="/" timeout="30">
---------------------------------------------------------
サーバーはWindows2000です。
アプリケーション化はアイコンで確認した所、できているようです。
VS2005の開発環境では正常に実行されていました。
解決策が分らずに困っております。
どうかご教示お願い致します。
回答
-
紅茶王子 さんからの引用
なんかおかしい気がしてきました。UserとPassをハードコーディングしても読めないのはおかしいですね。SQL Server認証でつながれているようですが、このつなぎ先が間違っているということはないでしょうか? 例えばテスト用のデータベースにつながっているなどです。
サーバーエクスプローラで実際にサーバへ接続するデータ接続を作成し、そのプロパティを見ると接続文字列がわかりますから、それを使ってみるのも手です。また、sqlcmdを使ってSQL Server認証(UserとPassを指定)で接続し、そこでselect文を発行して正しく値が取れるかどうかの確認をしてみて下さい。
すべての返信
-
皆様へ
ご教示下さい。
色々、調べてみると以下の掲示板を見つけました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9986&forum=7&3
確かにログインページはフォーム認証で作成してあり、他のaspxファイルは
動くのですがこのログインページのみが上記のエラーが出ます。。。
この掲示板にある
> 「アプリケーション レベルを超えて allowDefinition='MachineToApplication'
> として登録されているセクションを使うことはできません」
これは結局、フォーム認証の設定はアプリケーション単位でしか出来ないよって言うエラーです。この部分って、どの様にすれば解決できるのでしょうか??
勉強して間もなく理解ができなく恐縮ですがご教示下さい。
お願い致します!
-
紅茶王子 さんからの引用
回答済みは間違ってつけたものだと思います。
了解です。
紅茶王子 さんからの引用
この設定はどの様な工程で設定できるのでしょうか?インターネットインフォメーションマネージャで、Webアプリケーションのフォルダを右クリックしてプロパティを開き、
ディレクトリタブの「アプリケーションの設定」にある「作成」ボタンを押します。ただ、他のaspxのページが動いているということですし、問題なく作成されているんじゃないかと思います・・・。
既に作成されていれば、「作成」ボタンは無く、代わりに「削除」ボタンになっています。あとは、Webアプリケーションのフォルダ以下にweb.configが二つ存在していたりしませんか? backupフォルダ内にweb.configのコピーがあり、それが原因になった例がありました。
-
trapemiya さんからの引用 既に作成されていれば、「作成」ボタンは無く、代わりに「削除」ボタンになっています。
すでに削除ボタンとなっておりました。
trapemiya さんからの引用 あとは、Webアプリケーションのフォルダ以下にweb.configが二つ存在していたりしませんか? backupフォルダ内にweb.configのコピーがあり、それが原因になった例がありました。
VS2005でビルドの発行をした後は触っておりませんでしたので
確認した所、web.configは1つだけでした。。。
他には理由は見当たりませんか?
すみません。
よろしくお願い致します。
-
う~ん、現在、私が知っている限りは下の3つです。
1.アプリケーションとして作成されていない。
2.サブフォルダにweb.configがあり、それに関する適切な設定がされていない。
3.バーチャルサーバとして構成してあり、それに関する適切な設定がされていない。(参考)
You may receive the error "It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level" in asp.net
http://geekswithblogs.net/ranganh/archive/2005/04/25/37609.aspxアプリケーションでサーバー エラー
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2523&forum=7 -
trapemiya さんからの引用 (参考)
You may receive the error "It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level" in asp.net
http://geekswithblogs.net/ranganh/archive/2005/04/25/37609.aspxアプリケーションでサーバー エラー
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2523&forum=7ありがとうございます☆
1度しっかり読んでみて色々試してみます。
回答が分ったらまた投稿します☆
このフォームが表示の際にエラーが出るのもそうなのですが
このフォーム自体、SQLServerを利用したログインができないのです。
レコードにあるのですが・・・
別スレッドを立ててお伺いした方がよろしいですよね??
-
Web.Configの28行目の行頭って 『<』なのでしょうか?
そうなると 全てのASPXページでエラーになると思いますが
他のページでエラーにならないのは IE(ブラウザ)側のキャッシュで表示されているからなんてことはありませんか
でもこれが原因なら 表示の中心が28行になるはずですし、外している可能性が高いですね
検証方法として
新規のWebプロジェクトを作成
LoginPage.Aspxを追加
web.configを編集して Form認証にする
<authentication mode="Windows" />
を
<authentication mode="Forms">
<forms name="formauth" protection="All" loginUrl="Login.aspx" path="/" timeout="30"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
に変更URL/defualt.aspx にアクセスして login.aspxにリダイレクトされるかどうかを
ローカルIISでテスト 、ターゲットサーバーへUploadしてテスト
といった検証をしてみましょう
-
redfox63 さんからの引用 Web.Configの28行目の行頭って 『<』なのでしょうか?
そうなると 全てのASPXページでエラーになると思いますが
他のページでエラーにならないのは IE(ブラウザ)側のキャッシュで表示されているからなんてことはありませんか
ありがとうございます。
キャッシュはすべてクリアしているのでないと思います。
redfox63 さんからの引用 検証方法として
新規のWebプロジェクトを作成
LoginPage.Aspxを追加
web.configを編集して Form認証にする
<authentication mode="Windows" />
を
<authentication mode="Forms">
<forms name="formauth" protection="All" loginUrl="Login.aspx" path="/" timeout="30"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
に変更URL/defualt.aspx にアクセスして login.aspxにリダイレクトされるかどうかを
ローカルIISでテスト 、ターゲットサーバーへUploadしてテスト
といった検証をしてみましょう
教えて頂いた通り実行してみました。
ローカルIISではlogin.aspxにリダイレクトされましたが
サーバーへ発行後に実行するとmode属性をOffに設定して下さいと表示されたので
Offにした所、投稿時のエラーとなりました。
もともとlogin.aspxがエラーが出るのでリダイレクトしてもエラーのままと言った感じだと思われます。
ただ、サーバーに発行したフォルダのweb.configを削除するとlogin.aspxはエラーなしで表示されます。
-
紅茶王子 さんからの引用 ローカルIISではlogin.aspxにリダイレクトされましたが
サーバーへ発行後に実行するとmode属性をOffに設定して下さいと表示されたので
Offにした所、投稿時のエラーとなりました。
もともとlogin.aspxがエラーが出るのでリダイレクトしてもエラーのままと言った感じだと思われます。
ただ、サーバーに発行したフォルダのweb.configを削除するとlogin.aspxはエラーなしで表示されます。
mode属性を『Off』に設定ですか?
modeの設定値は『Windows』『Forms』『Passport』『None』だと思いますが
試しに 認証設定部分をコメントアウトした場合 login.aspxが表示可能なのでしょうか
コード ブロック<authentication mode="Forms">
<forms name="formauth" protection="All" loginUrl="Login.aspx" path="/" timeout="30"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>部分を
コード ブロック<!--
<authentication mode="Forms">
<forms name="formauth" protection="All" loginUrl="Login.aspx" path="/" timeout="30"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>-->
といった具合にして確認してみましょう
これでうまく表示出来ないのであれば IIS側の設定とかが問題なのかもサイトの新規構築の再の手順はどのようにしましたか
サーバーのサイトパスは wwwrootの配下なのでしょうか
-
redfox63 さんからの引用 mode属性を『Off』に設定ですか?
そうです。
アプリケーションでサーバーエラーが発生しました。
<customErrors>タグで"mode"属性を"Off"に設定してください。
と出ましたので<customErrors "mode"="Off />と追記した所、投稿時のエラーになりました。
今は消してあります。
redfox63 さんからの引用 試しに 認証設定部分をコメントアウトした場合 login.aspxが表示可能なのでしょうか
表示は可能でした。
新規構築の手順はVS2005の「Webサイトの発行」で行いました。
redfox63 さんからの引用 当方の環境で 『loginUrl』を『loginurl』などと記述した際に上記のメッセージが表示されました
一応確認しましたが問題なさそうでした。
VS2005のインテリセンス機能で作成したので大丈夫だと思うのですが・・・
-
一応、現在のweb.configの中身を投稿いたします。
<?xml version="1.0 encoding="utf-8"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<compilation debug="false" />
<authentication mode="Forms"> ←------------------
<forms name="formauth" protection="All" loginUrl="Login.aspx" path="/" timeout="30" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</configuration>
エラーは←------------------の部分が赤くなって表示されます。
印刷したものを手打ちで投稿しましたので間違えている部分がある場合もあります。
宜しくお願い致します。
-
これが原因かどうかわかりませんが、Login.aspxという名前はあまりよろしくなかった記憶があります。
ログインのランタイムエラーについて
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=635180&SiteID=7 -
trapemiya さんからの引用 これが原因かどうかわかりませんが、Login.aspxという名前はあまりよろしくなかった記憶があります。
ログインのランタイムエラーについて
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=635180&SiteID=7ありがとうございます。
試しにCheck.aspxでweb.configも書き換えてみましたが
出るエラーは同じでした。。。
ただ、妙な現象が起きます。
Login.aspxをCheck.aspxに書き換えたのに
URLの最後をLogin.aspxと入力すると「削除されたか見つかりません」では
なく同じエラーが出ます。
Login.aspxはそのフォルダに存在しません。
キャッシュの問題でしょうか?
何度もお手数ですが宜しくお願い致します。
-
-
trapemiya さんからの引用 問題を切り分けるために単純なことからやり直す方が早いかもしれません。ログイン認証画面が開くだけの単純なプロジェクトを作成し、それをWeb発行して動作確認してみて下さい。もし、動かなければ、その時のweb.configや、サーバー上に配置されたファイルの構成を教えて下さい。私の方でも試してみたいと思います。
ありがとうございます。
VS2005 90日間の評価版をダウンロードしインストールするまでに
時間がかかってしまいご回答が遅れました。
どうしていいか分らず落ち込んでおりました。
trapemiyaさまの心強いお言葉感謝致します。
VS2005 proでローカルにページを作成しました。
その際にweb.configも新しく作成しました。
WEBサイトの発行後にLoginPage.aspxを実行した所
<system.web>
<compilation debug="false" /><custom Errors mode="Off"/>
<authentication mode="Windows" />
</system.web>
</configuration>同じエラーが表示されました。
<custom Errors mode="Off"/>はエラー確認後に追記してエラー詳細を見ました。
ただ、web.comfigを配置しない場合LoginPage.aspxは表示されます。
宜しくお願い致します。
---------------------------------------------------ログインページ(LoginPage.aspx)-----------------------------------------
<%@ Page Language="C#" %>
<html>
<head>
<script runat="server">
void login_Click(object sender, EventArgs e) {
if (FormsAuthentication.Authenticate(tbUsername.Text, tbPassword.Text)) {
FormsAuthentication.RedirectFromLoginPage(tbUsername.Text,persist.Checked);
Response.Redirect("Main.aspx");
} else {
Message.Text = "失敗しました。パスワードを確認してください";
}
}</script>
</head>
<body>
<form id="Form1" runat="server">
<p>UserName : <asp:TextBox id="tbUsername" runat="server" /></p>
<p>Password : <asp:TextBox id="tbPassword" TextMode="Password" runat="server" /></p>
<p>
<asp:CheckBox id="persist"
Text="認証情報を記憶する" runat="server"/>
<asp:Button id="login" Text="ログイン"
OnClick="login_Click" runat="server" />
</p>
<p><asp:Label id="Message" ForeColor="red" runat="server" /></p>
</form>
</body>
</html>-------------------------------------------------------------------------------------------------------------------------
---------------------------------------------web.config-------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<compilation debug="false" />
<authentication mode="Windows" />
</system.web>
</configuration>-------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------machine.config(custom Error部分)--------------------------
<section name="customErrors" type="System.Web.Configuration.CustomErrorsSection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
--------------------------------------------------------------------------------------------------------------------------
-
現在、家におりますのでサーバーの環境がなく、ローカルマシンのIISに対してWeb発行しました。特に問題なく動いています。ご提示されたソースをそのままコピーして使っています。ただし、LoginPage.aspxという名前はLogin.aspxに変えています。この名前で大丈夫なことを一応確認したかったものですから。
とりあえず、Web発行されたフォルダの構造を以下に書きますので、比べてみて下さい。
c:\Inetpub\wwwroot\WebSiteTest20--+--bin--App_Web_default.aspx.cdcab7d2.dll
|
+--Login.aspx
|
+--PrecompiledApp.confg
|
+--Web.config以上、4つのファイルしかありません。
-
trapemiya さんからの引用 現在、家におりますのでサーバーの環境がなく、ローカルマシンのIISに対してWeb発行しました。特に問題なく動いています。ご提示されたソースをそのままコピーして使っています。
trapemiyaさま
どうもありがとうございます。
早速、Cドライブに任意のフォルダを作成してVS2005にてaspxを作成して
アプリケーション化されているフォルダにWebサイトの発行を行ってみました。
http://localhost/~のURL実行でよろしいのですよね?
実行結果は 「昨日、3:57 午後」と同じエラーがでました。
今までVS2005のF5実行ではうまくいっていたのですが、ローカルでの実行は初めて
でした。
VS2005のF5実行は開発サーバーなのでうまくいって当たり前なのですね・・・
trapemiya さんからの引用 とりあえず、Web発行されたフォルダの構造を以下に書きますので、比べてみて下さい。
c:\Inetpub\wwwroot\WebSiteTest20--+--bin--App_Web_default.aspx.cdcab7d2.dll
|
+--Login.aspx
|
+--PrecompiledApp.confg
|
+--Web.config以上、4つのファイルしかありません。
フォルダは4つでtrapemiyaさまと同じです。
binフォルダの中には「App_Web_a4w-x6xy.dll」という名前の
ファイルがありました。
ここは問題ないのでしょうか?
これが問題なければ環境でしょうか??
-----------------------------------------------現在までの状況です-----------------------------------------------
同じ、ソースのアプリケーションでVS2005のF5実行は正常に稼動する(開発サーバーがあるからですね?)
投稿途中に「ローカルでは表示されるがWebサーバーでは動かない」と投稿してしまいましたが
間違えておりました。。。
VS2005の中では動きますが、ローカル及びWEBサーバーにて実行すると「昨日、3:57 午後」と同じエラーがでます。
やはりweb.configを削除すると双方ともエラーなく表示されます。
何度もお手数ですがよろしくご回答お願い致します。
-
紅茶王子 さんからの引用
http://localhost/~のURL実行でよろしいのですよね?そう言えば、ローカルなIISにWeb発行する場合、localhostを使用すると、つまり、
http://localhost/webアプリケーション名
とすると、うまく発行できないバグがあったと思います。この場合、
http://コンピュータ名/webアプリケーション名
とするか、
http://127.0.0.1/webアプリケーション名
とすればOKです。また
C:\Inetpub\wwwroot\アプリケーション名
のようにしてもOKです。紅茶王子 さんからの引用
実行結果は 「昨日、3:57 午後」と同じエラーがでました。
このエラーというのは、一番最初にご提示されているエラーと同じなんですよね?
紅茶王子 さんからの引用
binフォルダの中には「App_Web_a4w-x6xy.dll」という名前のファイルがありました。
ここは問題ないのでしょうか?
問題ないでしょう。
紅茶王子 さんからの引用
これが問題なければ環境でしょうか??
ローカルなIISと他のサーバーでも全く同じエラーが出るわけですから、環境というわけでもなさそうですね。web.configも特に問題なさそうな気がしますが、念のため、ソリューションエクスプローラで右クリックして「新しい項目の追加」 -> 「web構成ファイル」で作成されたweb.configで試してみて下さい。あとは、インターネットインフォメーションマネージャで当該のwebサイトを選択し、そのプロパティのASP.NETタブでASP.NET2.0が選択されているか確認してみて下さい。ご提示されたweb.configはASP.NET1.1では動きませんので。
-
trapemiyaさま
幾度のご教示ありがとうございます。
trapemiya さんからの引用 http://コンピュータ名/webアプリケーション名
とするか、
http://127.0.0.1/webアプリケーション名
とすればOKです。また
C:\Inetpub\wwwroot\アプリケーション名
のようにしてもOKです。全て試してみましたが同じエラーが出ます。。。
trapemiya さんからの引用 このエラーというのは、一番最初にご提示されているエラーと同じなんですよね?
--------------------------------------------------------
構成にエラーがあります。
パーサーエラーメッセージ:アプリケーションレベルを超えて allowDefinition='MachineToApplication'として登録されているセクションを使うことはできません。このエラーは、仮想ディレクトリがIISでアプリケーションとして構成されなかった場合に発生します。
ソースエラー:
行24: を有効にします。
行25:-->
行26: <authentication mode="Windows" />
行27: <--
行28: <customErrors>セクションは、要求の実行中にハンドル
---------------------------------------------------------
こちらがエラーです。
trapemiya さんからの引用 ローカルなIISと他のサーバーでも全く同じエラーが出るわけですから、環境というわけでもなさそうですね。web.configも特に問題なさそうな気がしますが、念のため、ソリューションエクスプローラで右クリックして「新しい項目の追加」 -> 「web構成ファイル」で作成されたweb.configで試してみて下さい。
あとは、インターネットインフォメーションマネージャで当該のwebサイトを選択し、そのプロパティのASP.NETタブでASP.NET2.0が選択されているか確認してみて下さい。ご提示されたweb.configはASP.NET1.1では動きませんので。
念のため、web.config・Login.aspxも全て作り直して再発行してみましたが、結果は上記と同じです・・・
プロパティのASP.NETタブは「2.0.50727」が選択されていました。
もうお手上げ状態かもしれませんが宜しくお願い致します。
-
trapemiya さんからの引用 machine.configの問題かもしれませんね。もし、いじられているようでしたら、一度元に戻してみて下さい。
戻せないようでしたら、machine.config.defaultにデフォルトの設定がありますから、それをmachine.configにコピーしてみて下さい。
ありがとうございます。
何度も申し訳ありません。
machine.config.defaultの名前をmachine.configに変更してコピーしてみましたが
解消されませんでした。
フルリカバリした端末を2台用意して設定して実行してみたのですが
全て同じエラーが出ます。
インストールプログラムもしくは設定が違うのでしょうか?
調べて行ったので足りないものはないと思いますが
一応、見て頂けますでしょうか?
------------インストール済みのプログラム------------
Microsoft .NET Framework 2.0
Microsoft .NET Framework 2.0 日本語 Language Pack
Microsoft .NET Framework 2.0 SDK -日本語
Visual Studio 2005 Pro 既定インストール
-
紅茶王子 さんからの引用
調べて行ったので足りないものはないと思いますが一応、見て頂けますでしょうか?
特に問題ないです。
状況を整理します。
・紅茶王子さんが提示されたソース(web.config含む)で私のところでは問題なく動いた。
・machine.configもデフォルトに戻った。
・紅茶王子さんのところで複数の端末で同じエラーが発生する。上記から考えて、残るのは紅茶王子さんのところの環境ぐらいだと思うのですが、何か特殊なソフトが入っていませんでしょうか? 例えば、以下のようなこともありました。
新しいプロジェクトが作成できない(Webアプリケーション)
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-22917.htm -
trapemiya さんからの引用 う~ん、しつこく確認ですが、以下のWebSiteTest20のようになっているんですよね?
trapemiyaさま
ありがとうございます。
表示できました!
経緯は一旦リカバリしました。
IISをインストール後にFreameworkをインストール
フォルダを作成しaspxファイルを配置。
仮想ディレクトリ作成の際にtrapemiyaさまの
添付画像を見て、分かったのですが
test\web\appli(aspxファイル配置)というディレクトリがあったとします。
testで仮想ディレクトリをアプリケーション化していたのですが
下の階層のappliもアプリケーション化した所、表示されました。
長い期間、ご教示頂き原因が当方の環境設定であった事が申し訳なくて仕方ありません。
根気強く教えて下さって本当に感謝しております!
助かりました、心からありがとうございました。
-
trapemiyaさま
何度も申し訳ありません。
この投稿のLoginフォームは表示テスト用で
以下のコードが本物です。
Table内のUser,Pass が一致して尚且つ、AuthorityがCodeという条件だけの
ユーザーを認証成功としたいのですがどうしても認証してくれないのです。
どこが違うかだけでもアドバイス頂けませんでしょうか?
データベースには確かにその抽出条件にHITするレコードがあるのですが
ログイン失敗になってしまいます。
最後の最後に申し訳ないのですがお願い致します。
コードはスクリプト部分のみです。
<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %><html>
<head>
<script runat="server">
void objBtn_Click(Object sender, EventArgs e) {
// 入力されたユーザーID、パスワードでusrテーブル内のレコードを検索
SqlConnection objDb = new SqlConnection("server=web;database=Source;uid=id;pwd=pw");SqlCommand objCom = new SqlCommand("SELECT User,Pass Table WHERE User=@uid AND Pass=@passwd AND Authority=Code", objDb);
objCom.Parameters.Add("@uid",txtUsr.Text);objCom.Parameters.Add("@passwd", txtPass.Text);
objDb.Open();
SqlDataReader objDr=objCom.ExecuteReader();
if(objDr.Read()){
// 検索の結果、該当するレコードが存在した場合、認証は成功
FormsAuthentication.RedirectFromLoginPage(txtUsr.Text,false);Response.Redirect("Main.aspx");
}else{
objLbl.Text="正しいユーザーID、パスワードを入力してください";
}
objDb.Close();
} -
紅茶王子 さんからの引用
表示できました!
よかったです!
紅茶王子 さんからの引用
添付画像を見て、分かったのですが添付画像は最後の手段なんです。添付画像はわんくま同盟のサーバーに置いているんですが、ここから画像を削除してしまうと、後日、この掲示板を見た人には見えなくなってしまいますから。
なので少し文章で補足しておきました。紅茶王子 さんからの引用
test\web\appli(aspxファイル配置)というディレクトリがあったとします。testで仮想ディレクトリをアプリケーション化していたのですが
下の階層のappliもアプリケーション化した所、表示されました。
結局、ただのサブディレクトリにweb.configがあったのが原因だったようですね。この場合、appliのみを仮想ディレクトリにするか、web.configをtestに置いても動くでしょう。
最終的には、原因は仮想ディレクトリなどのWebアプリケーションの作り方だろうと思ったのですが、こういうパターンでもご提示されたエラーが発生するのですね。こちらこそ良い経験となり、勉強になりました。
-
紅茶王子 さんからの引用
データベースには確かにその抽出条件にHITするレコードがあるのですがログイン失敗になってしまいます。
まず、
objCom.Parameters.Add("@uid",txtUsr.Text);
は、互換性のために残されていますので、
objCom.Parameters.AddWithValue("@uid",txtUsr.Text);
を使うようにして下さい。
さて、ログイン失敗というのはどこで失敗しているのでしょうか?
データベースは何でしょうか? データベースが見つからないのかもしれませんし、レコードが読めないのかもしれません。
想像するに、データベースが見つからなければそういったメッセージが表示されますので、たぶん、データベースには接続ができているんじゃないかとは思います。気になるところと言えば、
SqlCommand objCom = new SqlCommand("SELECT User,Pass Table WHERE User=@uid AND Pass=@passwd AND Authority=Code", objDb);
における、Authority=Code です。これではCode列ということになってしまいます。Codeという文字列と比較したいのであれば、Authority='Code' です。
-
trapemiyaさま
度々のご教授申し訳ありません。
trapemiya さんからの引用 objCom.Parameters.Add("@uid",txtUsr.Text);
は、互換性のために残されていますので、
objCom.Parameters.AddWithValue("@uid",txtUsr.Text);
を使うようにして下さい。
なるほど。
objCom.Parameters.Addの部分は変更致しました。
trapemiya さんからの引用 さて、ログイン失敗というのはどこで失敗しているのでしょうか?
データベースは何でしょうか? データベースが見つからないのかもしれませんし、レコードが読めないのかもしれません。
想像するに、データベースが見つからなければそういったメッセージが表示されますので、たぶん、データベースには接続ができているんじゃないかとは思います。データベースでレコードがない場合はID・PWが間違えていますとLabelが出るなっているのですが
レコードが見つからないのでこのラベルが表示されるのだと思います。
接続失敗のエラーもないので接続はできている様です。
データベースはSQLServerです。
ACCESSのクエリで同じ条件を元に抽出をかけた所、レコードはあるのですが
フォーム上では見つからないのかID・PWが間違えていますとLabelが出てしまう状態です。
trapemiya さんからの引用 気になるところと言えば、
SqlCommand objCom = new SqlCommand("SELECT User,Pass Table WHERE User=@uid AND Pass=@passwd AND Authority=Code", objDb);
における、Authority=Code です。これではCode列ということになってしまいます。Codeという文字列と比較したいのであれば、Authority='Code' です。
そうでした。
基本的な所でした。。。
ここを修正しても同じエラーでした。
他に気になる部分ありますでしょうか?
よろしくお願いいたします。
-
紅茶王子 さんからの引用
SqlCommand objCom = new SqlCommand("SELECT User,Pass Table WHERE User=@uid AND Pass=@passwd AND Authority=Code", objDb);見逃していましたが、fromがありません。でも、これだと実行時にエラーになりそうな気もしますが・・・
SELECT User,Pass from Table WHERE User=@uid AND Pass=@passwd AND Authority='Code'
-
一応ですが、フルソースです。
<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
void objBtn_Click(Object sender, EventArgs e) {
// 入力されたユーザーID、パスワードでusrテーブル内のレコードを検索
SqlConnection objDb = new SqlConnection("server=ServerName;database=DataSource;uid=id;pwd=pw");SqlCommand objCom = new SqlCommand("SELECT User,Pass FROM Table WHERE User=@uid AND Pass=@passwd AND Authority='Code'", objDb);
objCom.Parameters.AddWithValue("@uid",txtUsr.Text);objCom.Parameters.AddWithValue("@passwd", txtPass.Text);
objDb.Open();
SqlDataReader objDr=objCom.ExecuteReader();
if(objDr.Read()){
// 検索の結果、該当するレコードが存在した場合、認証は成功
FormsAuthentication.RedirectFromLoginPage(txtUsr.Text,false);Response.Redirect("Main.aspx");
}else{
objLbl.Text="正しいユーザーID、パスワードを入力してください";
}
objDb.Close();
}
</script>
<html>
<head>
<title>データWEB ログイン</title>
</head>
<body>
<form id="Form1" runat="server">
<span style="font-size: 16pt">
<span style="color: #6666ff">データWEB</span>
<br />
</span>
<p>UserName : <asp:TextBox id="txtUsr" runat="server" /></p>
<p>Password : <asp:TextBox id="txtPass" TextMode="Password" runat="server" /></p>
<p>
<asp:Button id="objBtn" Text="ログイン"
OnClick="objBtn_Click" runat="server" />
</p>
<p><asp:Label id="objLbl" runat="Server" ForeColor="Red" /></p>
</form>
</body>
</html>宜しくお願い致します。
-
いろいろ絞っていくしかありません。
まず、デバッグ実行を行い、下記をブレークポイントで止めて、txtUsr.Text, txtPass.Textの値がきちんと入っているか確認して下さい。
objCom.Parameters.AddWithValue("@uid",txtUsr.Text);
objCom.Parameters.AddWithValue("@passwd", txtPass.Text);
値が入っているのであれば、
SELECT User,Pass FROM Table WHERE User=@uid AND Pass=@passwd
として、AND Authority='Code' を省いてみてください。
あとは、
SELECT User,Pass FROM Table WHERE User='hoge' AND Pass='fuga'
のようにハードコーディングしてみて下さい。
-
trapemiya さんからの引用 いろいろ絞っていくしかありません。
まず、デバッグ実行を行い、下記をブレークポイントで止めて、txtUsr.Text, txtPass.Textの値がきちんと入っているか確認して下さい。
objCom.Parameters.AddWithValue("@uid",txtUsr.Text);
objCom.Parameters.AddWithValue("@passwd", txtPass.Text);
値が入っているのであれば、
SELECT User,Pass FROM Table WHERE User=@uid AND Pass=@passwd
として、AND Authority='Code' を省いてみてください。
あとは、
SELECT User,Pass FROM Table WHERE User='hoge' AND Pass='fuga'
のようにハードコーディングしてみて下さい。
trapemiyaさま
ありがとうございます。
txtUsr.Text・txtPass.Textのいずれも値は入っている様です。
しかし、上記のどれを行っても
}else{
objLbl.Text="正しいユーザーID、パスワードを入力してください";←--------------------
}←--------------------に行ってしまいます。
なんかおかしい気がしてきました。
-
紅茶王子 さんからの引用
なんかおかしい気がしてきました。UserとPassをハードコーディングしても読めないのはおかしいですね。SQL Server認証でつながれているようですが、このつなぎ先が間違っているということはないでしょうか? 例えばテスト用のデータベースにつながっているなどです。
サーバーエクスプローラで実際にサーバへ接続するデータ接続を作成し、そのプロパティを見ると接続文字列がわかりますから、それを使ってみるのも手です。また、sqlcmdを使ってSQL Server認証(UserとPassを指定)で接続し、そこでselect文を発行して正しく値が取れるかどうかの確認をしてみて下さい。
-
trapemiya さんからの引用 SQL Server認証でつながれているようですが、このつなぎ先が間違っているということはないでしょうか? 例えばテスト用のデータベースにつながっているなどです。
何度も確認しましたが問題ありませんでした。
違うフォームにて同じ接続文字列でINSERTなどを行っておりますので・・・
trapemiya さんからの引用 また、sqlcmdを使ってSQL Server認証(UserとPassを指定)で接続し、そこでselect文を発行して正しく値が取れるかどうかの確認をしてみて下さい。
すみません。
このsqlcmdが分かりませんでした。
SQL Serverのsqlcmd.exeではなくてコードに書いて
値を確かめるという事でしょうか?
もしそうでしたらsqlcmdの使用方法のある
参考サイトありますでしょうか?
探してみたのですがなかったので困っていました。
-
trapemiyaさま
redfox63さま
ありがとうございます。
予想が当たりました。
カラムがネックだったようです。
よってコードを
SqlCommand objCom = new SqlCommand("SELECT User,Pass Table WHERE UserCode=@uid AND UserPw=@passwd AND Authority=Code", objDb);
objCom.Parameters.Add("@uid",txtUsr.Text);objCom.Parameters.Add("@passwd", txtPass.Text);
とテーブルのカラムを変更した事で期待通りの実行ができました!
カラムで動きが左右されるとは思っていませんでした・・・
しかし、結果原因が判明したのでよかったです。
trapemiyaさま
1度ならぬ2度ご教示頂きましてありがとうございました。
ご教示下さいました皆様ありがとうございました。
-
あ~、そうか、うっかりしていました。気付かずにごめんなさい。[user]みたいに括弧で囲えば大丈夫ですが、列名を変えた方が良いですね。それにしても動いて何よりです。また、解決されておみごとです。
Jet 4.0 の予約語の一覧
http://support.microsoft.com/kb/248738/ja