2009-06-03 14 views
5

私はASP.NET MVCの特定のページへのアクセスを制限するにはどうすればよいですか?

A)Identity.IsAuthenticated = falseを

またはそれらが認証されているが、

場合、ユーザーのEDITページ(例えば。/user/pure.krome/edit)へのアクセスをロックアウトしたいですb)Idenitity.Name!=編集しようとしているユーザーページのユーザー名
c)Identity.UserType()!= UserType.Administrator //これはRoleProvidersを使用しないロールのようなものです。

私はコントローラやコントローラーのアクションメソッドを何かで飾ることができると仮定していますが、私は何がわかりませんか?

答えて

3

AuthorizeAttributeから派生したカスタム属性が、私はこれを行うために使用するものです。 OnAuthorizeメソッドをオーバーライドし、独自のロジックを実装します。

public class OnlyUserAuthorizedAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorize(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new HttpUnauthorizeResult(); 
     } 
     ... 
    } 
} 
+0

興味深い...しかし...私はあなたの上で自分の論理を置き換える必要があることを知っています。しかし、あなたのコードは答えの一部です(a)。私は(c)を確認することもできます。しかし、私はどのようにコードが何を調べるべきかを知ることができなかった(b)。私はIdentity.Nameを持っています...しかし、この時点で、この属性はどのようにビューデータが分かっていますか?または、アクションメソッド内のデータ(私はまだ実行されていないと仮定していますが、属性は最初に処理されるため) –

+0

AuthorizationContextパラメータには、コントローラ、HttpContext、ResultContext、RouteData、およびResultへの参照が含まれます。一般化するには、属性に属性を追加して、ユーザーの名前に使用するルートデータキーを指定できるようにする必要があります。 。あなたは2つのコンストラクタを必要とするかもしれません:データベースコンテキスト/レイヤインタフェースをとるものと、パラメータを取らず、デフォルトのデータベースコンテキスト/レイヤを作成するもの。 – tvanfosson

2

次のActionFilterAttributeを実装し、認証と役割の両方を処理するように機能します。私はこのように私自身のDBテーブルの役割を格納しています:

  • のUserRoleは
  • public class CheckRoleAttribute : ActionFilterAttribute 
    { 
        public string[] AllowedRoles { get; set; } 
    
    
        public override void OnActionExecuting(ActionExecutingContext filterContext) 
        { 
         string userName = filterContext.HttpContext.User.Identity.Name; 
    
         if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
         { 
          if (AllowedRoles.Count() > 0) 
          { 
           IUserRepository userRepository = new UserRepository(); 
           User user = userRepository.GetUser(userName); 
           bool userAuthorized = false; 
           foreach (Role userRole in user.Roles) 
           { 
            userAuthorized = false; 
            foreach (string allowedRole in AllowedRoles) 
            { 
             if (userRole.Name == allowedRole) 
             { 
              userAuthorized = true; 
              break; 
             } 
            } 
           } 
           if (userAuthorized == false) 
           { 
            filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true); 
           } 
          } 
          else 
          { 
           filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true); 
          } 
         } 
         else 
         { 
          filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + String.Format("?ReturnUrl={0}", filterContext.HttpContext.Request.Url.AbsolutePath), true); 
         } 
    
    
        } 
    

    は、私はこのように呼んで

  • 役割(ユーザーIDとRoleID外部キーが含まれています)

    • ユーザーこれ...

      [CheckRole(AllowedRoles = new string[] { "admin" })] 
          public ActionResult Delete(int id) 
          { 
           //delete logic here 
          } 
      
  • +0

    上記の私の最初の行では、 "*認証*と役割" – mikerennick

    +0

    Mikerennick、あなたはユーザーや役割のキャッシュを行いますか? –

    +0

    キャッシュを使用していませんが、ユーザーに割り当てられたロールのうちキャッシュできなかったもの割り当てられたロールに変更が加えられると、キャッシュを更新できます。上記のコードは、現在のユーザーのhttpcontextを見ているだけなので、ユーザーのキャッシュには関係しません。 許可されたユーザーのチェックを追加することは、原則として許可された役割のチェックと同じです。 – mikerennick

    関連する問題