前回の記事で、割と枯れた技術のASP.NETでのForm認証の際にMembershipProviderを拡張してうんぬんという物を書きました。
何で今までのBlogの流れとは大きく外れて、そういうことを書いたかというと、Silverlightでログイン画面を作ろうとしたときに、これが使える!となったからです。
(別にSilverlightに限った話ではないです)
やりかたは、前回の記事の通りにMembershipProviderとRoleProviderを構成します。
ただ、MembershipProviderとRoleProviderで、二度目からのリクエストに備えてSessionに情報を格納したたけど、それをさくっと消して毎回DBに行くようにします。
(WebだけだとLogin画面で消せばよかったけど、Silverlightとかできちんと消す方法がわからなかった)
そして、ASP.NET Webアプリケーションのほうに、AuthenticationService.svcというファイルをテキストファイルとして新規作成したら、以下のような中身にします。
<%@ ServiceHost
Service="System.Web.ApplicationServices.AuthenticationService"
Factory="AuthSample.MyServiceHostFactory" %>
同じようにRoleService.svcというファイルをテキストファイルとして新規作成して、以下のように編集します。
<%@ ServiceHost
Service="System.Web.ApplicationServices.RoleService"
Factory="AuthSample.MyServiceHostFactory" %>
そして、Web.configに以下のような構成を追加します。
<system.web.extensions>
<scripting>
<webServices>
<!-- 認証サービスを有効化して、SSLは使用しない(覗き見されたくないならtrueにしてね) -->
<authenticationService enabled="true" requireSSL="false"/>
<!-- Roleサービスを有効化する -->
<roleService enabled="true" />
</webServices>
</scripting>
</system.web.extensions>
<system.serviceModel>
<!-- ASP.NETのパイプラインでWCFサービスを動かすよ -->
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
以上で、サーバーサイドの設定は完了です。
Silverlightアプリケーションを作成したら、この2つのサービスを参照設定で追加して、使えばOKです。
ログイン処理と、現在のロールを取得する処理は以下のような感じになります。
private void LoginButton_Click(object sender, RoutedEventArgs e)
{
var auth = new AuthenticationServiceClient();
auth.LoginCompleted += (s, args) =>
{
MessageBox.Show(args.Result ? "Login Sucess!" : "Login Faild");
};
auth.LoginAsync(userName.Text, password.Password, "", false);
}
private void GetRoleButton_Click(object sender, RoutedEventArgs e)
{
var role = new RoleServiceClient();
role.GetRolesForCurrentUserCompleted += (s, args) =>
{
var roles = args.Result;
// roleListという名前で画面に置いたItemsControlにロールのリストを表示する
roleList.ItemsSource = roles;
};
role.GetRolesForCurrentUserAsync();
}
各々のクラスの詳細は、以下のMSDNライブラリを参照してください。
AuthenticationServiceクラス
http://msdn.microsoft.com/ja-jp/library/system.web.applicationservices.authenticationservice.aspx
RoleServiceクラス
http://msdn.microsoft.com/ja-jp/library/system.web.applicationservices.roleservice.aspx
Serviceのメソッドを全部きちんと使おうと思うと、Providerもきちんと実装しないといけなさそうです。
因みに、このASP.NETのパイプラインでWCFサービスを動かそうと思ったら、ServiceContract属性以外にも、AspNetCompatibilityRequirements属性をつけないといけません。
例えば足し算するようなサービスだとこんな感じ。
using System.ServiceModel;
using System.ServiceModel.Activation;
namespace AuthSample.AdminServices
{
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public class CalcService
{
[OperationContract]
public int Add(int x, int y)
{
return x + y;
}
}
}
うん。いいね!