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