1

MVC 3 サイトで Forms Auth および ASP Universal Membership Provider を使用しています。ユーザーの利便性のために Cookie を保持しています。

FormsAuthentication.SetAuthCookie(model.UserName, true)

次のようにメンバーシップ プロバイダーでユーザーを無効にすると、次のようになります。

memUser.IsApproved = model.IsActive;
provider.UpdateUser(memUser);

Cookie があれば、サイトにアクセスできます。これは、この投稿で説明されている内容と似ています: http://stackoverflow.com/questions/5825273/how-do-you-cancel-someones-persistent-cookie-if-their-membership-is-no-longer-v

コントローラーで Authorize 属性を使用していますが、これは技術的には認証よりも Authorize に近いことを知っています。しかし、確かにオーバーループなので、ユーザーが実際に無効になっていないことを確認するための最良のMVC方法は何かを理解しようとしていますか? メンバーシップ データベースに対してユーザーをチェックするカスタム AuthorizeAttribute? チケットを無効にするためのフォーム認証に欠けている明らかな設定/方法はありますか?

アップデート:

基本的に私が行っていることは次のとおりです。カスタムのアクセス許可拒否ページを使用して、ユーザーに権限がないこととログインしていないことをより適切に通知するために使用します。そして、IsApproved チェックを追加しました。AuthorizeCore は、コントローラーまたはアクションに属性を配置すると呼び出され、false を返すと、HandleUnauthorizedRequest が呼び出されます。

public class CustomAuthorization : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated || !Membership.GetUser(filterContext.HttpContext.User.Identity.Name).IsApproved)
        {
            filterContext.Result = new HttpUnauthorizedResult();

            // in the case that the user was authenticated, meaning he has a ticket, 
            // but is no longer approved we need to sign him out 
            FormsAuthentication.SignOut();
        }
        else
        {
            var permDeniedRouteVals = new System.Web.Routing.RouteValueDictionary() { { "controller", "MyErrorController" }, { "action", "MyPermissionDeniedAction" }, { "area", null } };
            filterContext.Result = new RedirectToRouteResult(permDeniedRouteVals);
        }
    }

    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
    {
        // since persisting ticket,
        // adding this check for the case that the user is not active in the database any more
        return base.AuthorizeCore(httpContext) && Membership.GetUser(httpContext.User.Identity.Name).IsApproved; 
    }
}

使用法:

[CustomAuthorization()]
public class MyController
4

2 に答える 2

1

とにかく、データベースをチェックする必要があります。唯一の問題は、それをどのように行うかです。はい、カスタム承認属性を作成するか、ControllerBase で OnAuthorize オーバーライドのコードを記述するか、Application_AuthenticateRequest でそれを行うことができます。多くの方法は、何が最適かによって異なります。

もちろん、これが問題になる場合は、永続的なチケットを使用しないことが最善の方法です。

于 2012-04-30T17:51:55.180 に答える
1

「ログイン」という名前のロールが1つしかない場合でも、私はほとんど常にロールとロールプロバイダーを使用します-この問題の一部です。このようにすると、Authorize属性は次のようになります。

[Authorize(Roles="Login")]

ここLoginで、すべての「アクティブな」アカウントがログインできる必要がある基本的な「役割」を表します。すべての保護されたアクションは、少なくともこれによって保護されます。

そうすれば、「ログイン」ロールを削除するだけでユーザーが効果的に無効になります...なぜなら、私のロールプロバイダーでは、ログインしたユーザーのロールをデータベースまたはサーバーローカルの同等のものと照合しているためです。

あなたの場合、「ログイン」ロールはIsApproved、ユーザーモデルのフィールドのチェックに単純に解決できます。

于 2012-04-30T17:58:12.197 に答える