4

私は新しい MVC 4 Web サイトを作成しており、SimpleMembership をセットアップしています。また、RolePrincipal から継承し、LastName、FirstName、IsActive などのユーザーに関する追加情報を含む UserInfo という名前の追加プロパティを持つ CustomPrincipal も作成しました。これはすべて、FormsAuthenticationTicket の userData プロパティを介して Cookie に保存されます。

私の質問は次のとおりです。管理者ユーザーが他のユーザーのアカウントを無効にできる管理ページがあるとします - IsActive プロパティを false に設定します。同時に、無効化されているユーザーが実際に現在ログインしているとします。アクセス権が拒否された場合、このユーザーがサイトをナビゲートし続けられるようにしたくありません。

彼の FormsAuthentication Cookie を破壊するという意味で彼のセッションを強制終了するにはどうすればよいですか? これは正しいことですか、それともSimpleMembershipに欠けているものがありますか? このタスクを達成するための適切なパスは何ですか? アドバイスをいただければ幸いです...

4

1 に答える 1

3

次のように、Application_AuthenticateRequestとASP.NETCacheの使用を組み合わせることをお勧めします。

1)ユーザーが削除されたら、ユーザーIDをASP.NETキャッシュに書き込みます。このキャッシュでは、ユーザーIDを一定期間(おそらく1日)保持できます。

string cacheKey = "RecentlyDeletedUserId" + userId;
Cache.Add(
    cacheKey,
    true,
    null,
    DateTime.Now.AddDays(1),
    null,
    CacheItemPriority.Normal,
    null
);

2)global.asaxで、Application_AuthenticateRequestハンドラーを追加できます。ハンドラーは、フォーム認証チケットがサーバーによって正常に受信された後、すべての要求に対して起動されます。このハンドラーでは、1つの安価なメモリ内キャッシュ要求を作成して、そのユーザーが最近削除されたユーザーのリストに含まれているかどうかを確認します。そうである場合は、サインアウトしてログインページにリダイレクトします。

protected void Application_AuthenticateRequest(object sender, EventArgs e) {
    string cacheKey = "RecentlyDeletedUserId" + userId;
    if (Cache[cacheKey] != null)
    {
        FormsAuthentication.SignOut();
        FormsAuthentication.RedirectToLoginPage();
    }
}

何らかの理由でリダイレクトアプローチが気に入らない場合は、次のようなアプローチを取ることができます。

protected void Application_AuthenticateRequest(object sender, EventArgs e) {
    string cacheKey = "RecentlyDeletedUserId" + userId;
    if (Cache[cacheKey] != null)
    {
        IPrincipal anonymousPrincipal = new GenericPrincipal(new GenericIdentity(String.Empty), null);
        Thread.CurrentPrincipal = anonymousPrincipal;
        HttpContext.Current.User = anonymousPrincipal;
    }     
}

これにより、ユーザーが匿名ユーザーに置き換えられるだけで、ユーザーはサイトで何もできなくなります。(この代替アプローチは、ASP.NET FormsAuthenticationサーバー側の無効化によるものです。)

于 2013-02-10T01:26:27.823 に答える