Windows Azure AppFabric ACS使ってフェデレーション認証するのはいいけど、味気ないサインイン画面で辟易してる方も多いんじゃないでしょうか。
↓味気ないサインイン画面
というわけで今日はこいつのカスタマイズをしたいと思います。
ゴールとして今回はASP.NET MVC3のログイン画面内で上記のサインイン画面(というかセレクタ画面)を埋め込んでアプリケーションでちゃんと(?)制御できるようにしたいと思います。
Windows Azure AppFabric ACS使ってフェデレーション認証するのはいいけど、味気ないサインイン画面で辟易してる方も多いんじゃないでしょうか。
↓味気ないサインイン画面
というわけで今日はこいつのカスタマイズをしたいと思います。
ゴールとして今回はASP.NET MVC3のログイン画面内で上記のサインイン画面(というかセレクタ画面)を埋め込んでアプリケーションでちゃんと(?)制御できるようにしたいと思います。
さっきの投稿でも書いた System.Web.Providers ですが、名称としては ASP.NET Universal Providers というそうです。
簡単に何をするものか説明すると、「ASP.NET におけるセッションステート、メンバシップ、ロール、プロファイル機能を、SQL Compact と SQL Azure にも対応させるツール」 という感じでしょうか。パクリですけど。
Node.js、Ruby、Python を Windows Azure で利用する Smarx Role ~ クラウドカバー Episode 48 より引用
ASP.NET におけるセッションステート、メンバシップ、ロール、プロファイル機能を、SQL Compact と SQL Azure にも対応させるツール “ASP.NET Universal Provider” がアルファ版としてリリースされました。
これにより、これまでのオンプレミスな Windows & SQL Server という組み合わせに加え、低トラフィックな Web サイトでは共有ホスティング & SQL Compact を利用、トラフィックが多い Web サイトでは Windows Azure & SQL Azure を利用する、といったことが可能になります。
ということで便利でナイスなプロバイダなわけですが、現時点でnugetから入手できるASP.NET Universal Providerは 0.1です。
でも、ASP.NET MVC 3 Webロールテンプレートに含まれる System.Web.Providers は1.0扱い?なんですよね。アセンブリも違うもののようです。(中身まで見たわけじゃないですがバイナリは異なる)
そのうちNugetにもあがる気はしますが、とりあえず正式版?がASP.NET MVC 3 Webロールテンプレートには含まれてるようです。
ちなみにアセンブリは<プロジェクトフォルダ>\packages\System.Web.Providers.1.0 のLibにあります。EULAやReadme.htmlもあるので使い方とか参考にどうぞ。
これはちゃんと使いこなしたいですね!
※EULAのどこどう見たらGoLiveなのか詳しい人に教えてもらいたいところ…ちゃんと読めという話ですが。
※EULAの補足。nugetで入手できる0.1はALPHA版ということで、商用利用が制限されています。ただ、ASP.NET MVC 3 Webロールに含まれてる1.0のほうはこの制限がないので、商用利用OK、Go-liveとみていいと思います。
いろいろ盛り込んでくれますね!Azure Team!
先日の投稿でも書きましたが、Windows Azure Tools for Visual studio v1.4 (August 2011 Update)でASP.NET MVC 3のWebロールテンプレートが追加されました。
で、このASP.NET MVC 3なWebロールを使うと今まで面倒だったアセンブリの追加とかが不要なわけですが、そのまま何も気にせずデプロイするとエラーになります。
よくみる(?)画面ですね。
さて、この原因ですが Deploying the Windows Azure ASP.NET MVC 3 Web Role にもある通り、ASP.NET MVC 3 Webロールプロジェクトテンプレートに含まれてるWeb.configにて、SQL Expressなカスタムセッションを利用するようになっているのが原因です。
解決方法はWade Wegner氏が書いてるとおりSQL Azure使うように正しく接続文字列変えてあげると良いのですが、面倒な場合はsessionState属性のmodeをOffとかInProcにすればいいんじゃないでしょうか。(投げやり)
※というのもちゃんとアプリケーション作るときはこの辺きちんと考慮するだろうし、デフォルトのままデプロイしたりするのは訓練されたあじゅらーぐらいな気もするので…
まぁ、そのうち修正されるかもしれませんがちょっとしたbad know-howということで…
たけはらさんにTumblrで教えていただきました。
どうもこのASP.NET MVC 3 Webロールテンプレートで使っているセッションやメンバシッププロバイダ等各種プロバイダはEntityFrameworkベースのSystem.Web.Providersだそうです。
未来を先取りテンプレート!!
ということは、Bad know-howで問題点として片付けるんじゃなくて、新しいテクノロジを活用しよう!っていう方向に持っていくべきですかね。
たけはらさんありがとうございます。
mvcConf @:Japan ~ ASP.NET MVC ブートキャンプ ~ のセッションビデオが公開されたようです。
公開場所はCh.9ですよ!当日は流れなかったビデオメッセージも多数公開されていてうれしい限り。
もちろんScott Guthrie氏やScott Hanselman氏のメッセージも公開されています。
Channel 9ということもあり動画は複数エンコードから選んでダウンロードもできるしセッションスライドもダウンロードできます。
もちろん…あれ(?)もw
さてスピーカーの皆様がフォローアップ記事を書かれてるのでいくつか追加しておきます。
6月11日に品川でmvcConf @:Japan ~ ASP.NET MVC ブートキャンプ ~が開催されました。楽しそうだったのでいろいろ無理をいって参加してきましたので軽くまとめ。(技術面はほとんど書いてないのであしからず)
ちなみにMVPなBlogに取り上げられるくらい注目度は高かったようです。
Twitterのハッシュタグは #mvcjpn だったようなので、追うことができると思います。
セッション中のつぶやきはTogetterにまとまっていました。
なお、後日Ch.9での動画公開や@ITへレポート記事が載るようです。
CodePlexにある、Access Control Service Samples and Documentationが素晴らしい感じなので、参考になればと思いざっくり訳してみました。(適当な翻訳なのと、一部画像を追加したりしています。気になる方(及び最新情報)は原文を見てください。)
※しばやん氏にASP.NET MVCだけでいいよと指摘頂いたので修正 (2011/05/29) 指摘ありがとうございます。
チャック全開兄者からパスが来たので、試してみます。
Visual Studio 2010でASP.NET MVC3 プロジェクトで開発する場合、本番環境に配置する為のアセンブリを追加したり、Binフォルダに一緒にコピーするように設定したりすごく面倒です。
特にWindows Azure上でASP.NET MVC3なWebアプリを展開する場合、気を付けないとアセンブリ不足で動作しないで凹むとかしょっちゅうです。中にはVisual Studio向けAzureプロジェクトテンプレートにMVC3を追加したり、いろいろされてる方もいらっしゃるようです。
でも面倒くさいですね(
NuGetで入るならまだしも。。
ということで、そのうち正式にWindows Azure SDKがASP.NET MVC3に対応すると思いますが、それまでのつなぎな手法を今日は紹介しておきます。
お手紙ありがとうございます。
すっかり春の陽気で過ごしやすくなりましたね。まだまだ朝晩は冷え込みますのでお体にはお気を付けください。あ、MVPおめでとうございます。
おいらといいますと、おかげさまで元気に忙しく過ごさせて頂いています。
さて例のWCF Data ServicesをFormsAuthenticationでアレコレしてゴニョゴニョする件ですが、ASP.NET MVCのアクションメソッドでこうするとできるんだ~!という新しい知見が開けて大変興味深かったです。
ASP.NET MVCのアクションでやる場合、楽ちん・便利という視点ではなく、アプリケーション全体として見てどうなのかな?と単純に思いました。
WCF Data Servicesのみで完結させた場合は以下のような特徴が考えられます。
ではASP.NET MVCのアクションの場合はというと。
などがありそうです。まぁどちらもにわかな人が考えた内容なので間違ってるかもしれませんが。。
個人的に思うのはやっぱりアプリケーションの構成をどうするか、認証方式をどうするか/したいか、が一番大きなポイントでしょうか。
もともとはおいらが求めた要件にマッチするのがWCF Data Servicesで完結させる方法だった、というのとWebアプリ/データアクセス/認証をできるだけ分離しておきたかったというのが大きなポイントで以前の投稿のような形式になった背景がありますので、単純な比較は難しいですね。(Federation認証等ともからんじゃったり色々…)
ということでケースバイケースという魔法のことばでぽぽぽーん集約してしまいますが、ボツネタにならず公開して頂いてよかった!と思いますです。
あぁ、この内容こそ没ネタにすべきだったかなw
あと関係ないですがTHE CODE PROJECTはいろいろ勉強になりますね。
ではでは。
今日ちょっとなやんでしばやん先生に即答してもらったのでメモ。
まずリソースファイルをPublicにしておきます。要確認。
リソースファイルのプロパティでカスタムツールを PublicResXFileCodeGenerator にしてビルドアクションで”埋め込まれたリソース”にしておきます。
あとはデータアノテーションのところでリソース指定するだけ。
例:ASP.NET MVCで既定で生成されるAccountModelなど
[Display(ResourceType = typeof(YOURNAMESPACE.App_GlobalResources.StringResources), Name = "ResUserName")]
public string UserName { get; set; }
超簡単ですね。
ASP.NET MVC3での多言語対応はこちらも参照。
ただこれやって発行したりするとリソースDLLはできてるんだけど読み込めないみたいなんですよね。なんでだろ。。まだ調べてる途中なのでわかったら追記等します。
2011.02.23 追記
いろいろ見てると以下の事がわかりました。
ということでGetGlobalResourceObjectが問題。Webアプリケーションの発行先にApp_GlobalResourcesフォルダ(と.resxファイル)があれば問題なく動作しますが、埋め込みリソースとしてビルドするとアセンブリに埋め込まれて(あとサテライトアセンブリが出来て)発行先にはApp_GlobalResourcesフォルダは含まれません。
で、この状態でGetGlobalResourceObject呼び出すとNGと。嵌ってた状況はこんな感じです。
じゃぁどうやってアクセスするんだ?というと単純にリソースは既にPublic化されているわけですから
@MvcApplication1.App_GlobalResources.StringResources.String1
みたいにしてあげればいいわけですね。やぁ長かったよ。
参考にしたサイトはこちら。
ゼロから始めるといろいろ壁にあたりますね~。