2007年09月04日

ASP.NETのログイン画面をスキップさせる(自動ログイン)

ASP.NET2.0のログインコントロールは大変便利である。セキュリティを掛けたページを開こうとすれば自動でログイン画面が表示される。仕組みもブラックボックス化されているのでコントロール(loginコントロール)を貼り付けるだけで済んでしまう。

ところで、最近手がけた仕事でセキュリティは保ちたいがログイン画面で入力するのが面倒だから何とかならないかという相反するリクエストがあった。
普通であれば「その程度の面倒臭さは仕方ありません、我慢してください(^^)」と答えるところだが、ユーザーがパソコン初めての年配の方々の集まりということ(^^;で何とかしましょうということになった。

で、考え出したのが下図のような自動ログインの仕組みである。
ユーザー名とパスワードを引数としてログインページに渡すというもの。
セキュリティ上若干問題があるが、それは仕方ない。優先すべきは「入力しない」ことだから。

自動ログインの仕組み

詳しくはサンプルソースで確認してもらいたい。
ログイン画面はログインコントロールのデザイン部分を利用しているが、ログインコントロールではなく、テキストボックスとボタンコントロールの組み合わせである。認証の部分をプログラムで行っている。といっても複雑ではない。たった2行でOKだ。

サンプルソース:autologin.lzh
※解凍後「サンプルの使い方.html」を参照
posted by なっちゃん at 21:09| 静岡 ????| Comment(0) | TrackBack(1) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年07月27日

SQL Server 2005 デフォルトではネットワーク接続が無効

新しいシステムを構築するためにSQLServer2005 DeveloperEditionをインストールし、サンプルプログラムから接続しようとしたところ、「SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります....」というようなエラーが出た。

調べてみるとSQLServer2005ではデフォルトでネットワーク接続が無効になっているらしい。はて?Express版を以前使ったときも同じエラーがしたかな?と思ったが随分と昔のことなので思い出せない(^^;
最近のMicrosoft製品は「デフォルトセキュア」つまり、既定ではセキュリティが最も厳しい状態(安全性が最も高い状態)でセットアップされるようである。

ここに参考資料があるので一読してみよう。
http://www.microsoft.com/japan/sql/ssj/tips/01.mspx

続きを読む
posted by なっちゃん at 13:45| 静岡 ????| Comment(0) | TrackBack(1) | ETC | このブログの読者になる | 更新情報をチェックする

2007年07月25日

DropDownListのAppendDataBoundItemsは問題あり

DropDownListにバインドしたデータとは別に「選択してください」とか「全て」とかいった非バインドデータを追加したいことがある。
この場合の処理で参考書とかによく掲載されているのがAppendDataBoundItemsプロパティを使う方法だ。しかし、実際の現場で使うときに非常に困った現象が起きる場合がある。
今回はその例と回避方法を紹介する。

DropDownListコントロールを単独で使う場合では問題は起きない。
どういう状況で起きるかといえば、データベースのリレーションによる階層(関連)データを絞り込む場合である。
下図サンプルは、OrderテーブルのOrderIDがCustomerIDとEmployeeIDによって絞り込まれる様子である。

1.DropDownListの標準使用では条件にあった件数(この場合は2件)分のデータがリストに追加される。(左DropDownList)

2.AppendDataBoundItemsを有効にした場合、2セット(4件)重複して追加されてしまう。(中央DropDownList)
これはページロード時に、CustomerIDのDropDownListとEmployeeIDのDropDownListにデータがバインドされる度にOrderIDのDropDownListに連動されてバインドが実行され、さらに自分自身がバインドした結果だと思う。

これを回避する方法はいろいろ試した結果、AppendDataBoundItemsプロパティを使わずに
3.Item.InsertメソッドをDataBoundイベントの中で実行する方法である。(右DropDownList)
余分に追加することがないように条件をつけてある。

DropDownListサンプル
※画面は合成したもの


'--上記2の処理--
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
If Not IsPostBack Then
ddlOrder.Items.Clear()
ddlOrder.Items.Add(New ListItem("全て", ""))
ddlOrder.AppendDataBoundItems = True
End If
End Sub
 
'--上記3の処理--
Private Sub ddlOrder2_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles ddlOrder2.DataBound
If ddlOrder2.Items.Count = 0 Or _
(ddlOrder2.Items.Count > 0 AndAlso ddlOrder2.Items(0).Text <> "全て") Then
ddlOrder2.Items.Insert(0, New ListItem("全て", ""))
End If
End Sub
posted by なっちゃん at 13:51| 静岡 ????| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

Web.Config には記述する順番がある

Web.Configには記述の順位が存在する。
普段ほとんど意識しないが、サードパーティのコンポーネントを利用しようとして「appSettings」を追加したら途端にコンパイルエラーになってしまい原因がWeb.Configに追加した場所にあることがわかった。

Web.Configの記述順位
posted by なっちゃん at 13:34| 静岡 ????| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年07月06日

VistaでInternetExplorerのURLを取得する場合の注意

以前、既存アプリケーションのVista対応について6回にわたって注意事項や対策を紹介したが、今回はその番外編である。

前回、いろんな対策があるが一番手っ取り早いのはビルトインユーザのAdministratorでログオンさせれば、これまで同様に使うことが可能だと紹介した。しかし、Administratorであるがゆえに問題が発生する場合があることも最近わかった。この問題について私がMicrosoftへ照会し、それについてMicrosoftの公式見解として、同社の了解を得て紹介するものです。

自作ソフトのScreenCutter(シェアウェア版)にはIEの画面をキャプチャーする機能がある。

IEのキャプチャー

上記メニューをクリックすると現在IEで開いているURLを全て取得してそのなかからキャプチャーしたいURLを選択することが可能なのだが実はVistaではURLの取得に失敗してしまうのだ。

当初IE7のタブブラウザが問題なのかと思ったがXPのIE7では正常に取得できたのでVista固有の問題だと思い、いろいろ調べ、代替策も探してみたが見当たらず途方にくれていた。そこでMicrosoftに問い合わせてみたところ、VistaのしかもビルトインユーザーのAdministratorでの障害であることが判明した。正確に記すと以下のようになる。

「ビルトインの Administrator アカウントで Internet Explorer を起動している場合に、ShellWindows オブジェクトに Internet Explorer オブジェクトが正しく追加されないという問題」

よって、Adiministrator以外のユーザーであれば何でも良く、AdministratorsやUsersグループのユーザーで確認したところ正常にURLが取得できたのである。

何ともはや・・・・Administratorは万全では無かったというわけである。他に同様のAdministratorの不具合があるのかは不明だが、Microsoftでは次のように答えている。
Windows Vista では Administrator のアカウントは特殊なアカウントであり、できれば使用されないことが望ましく、Administrator アカウントでは UAC が ON であってもすべてのプロセスは整合性レベル高にて動作することから、実質的には UAC が OFF の場合との差がない・・・云々」(※一部文章表現は当方で編集)

ということで参考にしましょう。
posted by なっちゃん at 14:32| 静岡 ????| Comment(0) | TrackBack(0) | Windows Vista | このブログの読者になる | 更新情報をチェックする

2007年07月05日

CSV出力時の不具合

GridViewに表示した内容をCSV出力する処理を作っていてちょっと困った現象があったので、それを今回のTipsとして紹介する。

といってもCSV出力自体の方法ではない、出来上がったCSV出力データを開いたり保存したりする時の問題である。

CSV作成完了

上記画面が出た後、「開く」や「保存」を選んでも下図の画面から先に一向に進まないのである。

ダウンロード中

このとき、一度「キャンセル」させて再度実行すると次からは正常に開いたり保存できたりするのだ。
ユーザーに一度キャンセルしてくださいなどと言い訳するわけにもいかないのでいろいろ調べてみたがどうやっても直らない。
そこで、この問題とは関係なくもともとCSV出力時に確認ダイアログをつける予定だった処理を付け加えたところ、何とそれによって問題はあっさり解決した。

その処理は、下図のようにボタンにJavaScriptを追加するものである。

クリックイベントでダイアログ表示

こうすることで出力ボタンを押すと

確認ダイアログ

が表示され、これ以降は正常に処理が進むのである。

ただ、本当の原因は別なところにあるようで、このワンクッションを付けなくても正常に進む場合もあった。
そういうわけで、もし途中で止まるような場面があったらこうしたらというTipsです。
posted by なっちゃん at 14:05| 静岡 ?J| Comment(2) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年06月27日

外部Javascriptでまた同じ過ちを・・・Javascriptのデバッグ方法

以前「ASP.NETでJavascriptを外部ファイルにする場合の注意」というTipsを書いたが、また同じ過ちをしてしまった。

文字コードがUTF-8になっていないためのエラーだった。ただ今度の場合、開発環境のWindowsXPでは正常に動作していたので、ユーザーの運用環境であるWindowsServer2003でエラーをしたときもそれが原因だとは思わなかった。
インターネットで見つけたJavascriptのサンプルを一部修正して使ったのだが案の定Shift-JISで保存されたものだった。一部に日本語が使われていたが、正常に動作してたためそのまま使っていたのだ。
それがWindowsServer2003では読み込み時にエラーして全く使えない状態になり(下図)、

読み込み時エラー発生

そこで初めて問題に気が付いたわけである。しかも自分で書いた以前のTipsのことをすっかり忘れていて数時間無駄に原因を調べていた。が、このときJavascriptのデバックの方法を見つけたのが唯一の収穫でもあった。

Javascriptをデバッグするときこれまで良く使ったのはalert文を使って途中で止めることだった。これだと予想されるバグの発生場所にいくつもalertを書いていかなくてはいけないので結構面倒だった。
それが、次の方法で不要になる。ただしブラウザはIEに限るが。

インターネットオプション−詳細

IEのインターネットオプションの「詳細設定」で上図のように「スクリプトのデバッグを使用しない(Internet Explorer)」のチェックを外す。こうするとエラーの発生した場所(行番号)とエラー内容を表示してくれる。(下図)

Javascriptのデバッグ

エディタ画面にもその外部Javascriptソースが開きカーソルが点滅している。

ともかく外部Javascriptは必ずUTF-8で保存しておこう
posted by なっちゃん at 10:54| 静岡 ??| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年06月21日

消えたテンプレート

いつものように、プロジェクトにWebフォームを追加しようとして「新しい項目の追加」を開いたところ・・・無い!テンプレートから「Webフォーム」が消えている!!(下図)

Webフォームが消えてしまったテンプレート一覧
Webフォームが消えたテンプレート

ここ数日別の作業をしていてフォームの追加はしていなかったが、テンプレートから消えるなんてことは一度も無かった。これじゃ仕事にならんではないか!

怒っても仕方が無いので原因と対策を調べてみたが、マイクロソフトのヘルプ「テンプレートの問題を解決する」では、自作のテンプレートのことを言っているので元々提供されているテンプレートが消えた今回の場合には当てはまらない。

結局、VisualStudio2005を修復セットアップして回復した。よく見るとWebフォーム以外にも(いつの間にか)消えていたらしいテンプレートもあることが分かった。何で消えるのだろう?

きれいに復帰したテンプレート一式
テンプレートが元通りになった
posted by なっちゃん at 20:53| 静岡 ????| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年06月14日

AJAX Control Toolkitの「Calendar」の月が日本語にならないのは

ASP.NET AJAX Control Toolkitの中からCalendarを使ってみた。

月が英語表記になっている

とても便利なのだが、月の表記が英語になってしまう。
サンプルではちゃんと日本語になるのに、自分の作ったページではどういうわけか英語表記になってしまう。

半日ほど調べまわってようやく、サイトのサンプルの下に英語で何やら書いてあるのを見つけた。これによるとページの国別属性Cultureの設定が必要だということ。ページ単位なら@Pageディレクティブにサイト全体ならWeb.Configに設定するようだ。
試しにWeb.Configに設定してみた。

カルチャー設定

でもやっぱり英語表記のままだった(--;
もう一度説明を見るとCulture設定を有効にするには、さらにAJAXのScriptManagerのプロパティ「EnableScriptGlobalization」「EnableScriptLocalization」を有効にする必要があると書かれていた(^^;

ScriptManagerのプロパティ設定

以上の設定をしたところ、やっと日本語表記になった!
しかも曜日も日本語になっている。

月が日本語になっている

※ちなみに、ScriptManagerのプロパティを有効にすれば、Culture設定はあえて記述しなくても日本語表記になることも判った。
posted by なっちゃん at 10:21| 静岡 ?J| Comment(2) | TrackBack(2) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年05月10日

Microsoft SQL Server Management Studio Expressではインポート・エクスポートの機能が無い

SQLServer2005 Express Edition はかつてMSDE(Microsoft SQL Server Desktop Engine)と呼ばれていた無償のデータベースソフトの後継で.NET(2.0)対応版であるが、MSDEには無かった管理ツール「Microsoft SQL Server Management Studio Express」が無償でダウンロードして使える。これは大変うれしいものだった。

ところが、やはり無償ということで製品版と違い、いくつかの機能が削られている。その一つがインポート・エクスポート機能である。

開発の途中でそれに気が付き、今更のDeveloperEditionに置き換えるのも面倒なのでManagement StudioだけをDeveloperEditionからインストールすることにした。
何とかインストールできたが、WindowsUpdateを行うとSQLServer2005のServicePack2が適用される。既にExpress版のSP2を適用済みなのだが、ツールだけでも別物と解釈されるらしい。
データベース本体まで影響があるのかと心配したが別に問題なく動いている。
posted by なっちゃん at 10:52| 静岡 ??| Comment(0) | TrackBack(2) | ETC | このブログの読者になる | 更新情報をチェックする