0

認証されたユーザーがサイトの有効なメンバーシップを持っているかどうかを確認する必要があります。たとえば、ユーザーのメンバーシップがアクティブな場合、ユーザーはサイトの「メンバー専用」エリアを自由に閲覧できますが、メンバーシップが非アクティブまたは有効期限切れの場合、Web サイトの請求エリアに自動的にリダイレクトされます。特定の制限されたページのみを表示できます。

ユーザーのメンバーシップの有効期限を FormsAuthentication Cookie に保存することで、これにアプローチすることを考えています。私はカスタム MembershipProvider を使用しており、既にユーザーの ID を Cookie に保存しているため、これは簡単に行うことができます。認証 Cookie は 24 時間で期限切れになるように設定されています。AuthorizeAttribute次に、次のように custom を使用してメンバーシップがアクティブかどうかを確認します。

public class MembershipAuthorizeAttribute : AuthorizeAttribute
{
    private readonly bool authorizeMembership;

    public MembershipAuthorizeAttribute()
    {
        this.authorizeMembership = true;
    }

    public MembershipAuthorizeAttribute(bool authorizeMembership)
    {
        this.authorizeMembership = authorizeMembership;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (this.authorizeMembership)
        {
            // Code to validate the membership hasn't expired
        }

        return base.AuthorizeCore(httpContext);
    }
}

次に、コントローラーを次のように装飾できます。

[MembershipAuthorize]
public class ActiveMembersController : Controller
{
    // Only users with an active membership can access this controller
}

[MembershipAuthorize(false)]
public class BillingController : Controller
{
   // All members can access this controller
}

これは良いアプローチですか、それともユーザーのメンバーシップがアクティブかどうかを検証するためのよりクリーンでより好ましい方法はありますか? ユーザーのメンバーシップの有効期限日またはステータスを取得するためだけに、すべてのリクエストでデータベースにアクセスする必要はありません。そのため、この値を Cookie に保存したいと考えています。また、この値を FormsAuthentication Cookie に保存しても問題ありませんか、それとも別の Cookie に保存する必要がありますか?

4

2 に答える 2

0

私はこれに別の方法でアプローチします。有効期限が切れているメンバーシップを確認し、それらのアカウントを無効にするバックグラウンド プロセスが必要です。

ユーザーがログインを試みた場合、アカウントが無効になっているかどうかを確認し、それに従って対処します。

于 2013-09-27T05:24:39.540 に答える
0

その情報を Cookie に保存することは、正しいアプローチとは思えません。この回答https://stackoverflow.com/a/706874/2168278で指摘されているように、その理由は、Cookie がクライアントのマシンに保存されているためです。そのため、改ざんされる可能性があります。

この情報をデータベースに保存する方が適切と思われます。パフォーマンスが気になる場合は、いつでもクエリをキャッシュできます。

于 2013-09-27T05:07:59.993 に答える