2016-08-15 6 views
0

ユーザーがログインしていないか、管理者でない場合、コントローラのメソッドへのアクセスを防ぐ方法を解明しようとしています。私は、ユーザーと彼の状態(ログイン、管理者など)を追跡する変数を持つクラスを持っています。特定の変数に特定の値がある場合、MVCはコントローラメソッドへのアクセスを禁止します

これはValidationAttributeを使用して行うことができると思います。私はこのテクニックを使用していないので、おそらく何か間違っています。この機能は、すでにある

AccountController.CS

[AdminUserValidation] 
public ActionResult Index() 
{   
     var account1 = account.GetAccountsWithType(); 
     return View(account1.ToList()); 
} 

AdminUserValidation.CS

public class AdminUserValidationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (UserSession.Current.IsAdmin) 
     { 
      //Allow access to the controller's method 
     } 
     else 
     { 
      //Prevent access to the controller's method and show error page (bad request/forbidden) 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 
+2

をAuthorizeAttributeはここにあなたの友人になります。 – Steve

+0

ビルドインUserManagerを使用したくないのは、ビルドインデータベース内にユーザーを格納する必要があるからです。私は自分のデータベースをユーザーとその役割に使用します。 'UserSession.Current .IsAdmin'変数を使用してこれを検証できる方法はありますか? – DaGrooveNL

+0

私はまた独自のテーブル構造を使用し、カスタムのメンバーシップ/ロールプロバイダを構築しました。 – Steve

答えて

0

AccountController.CS

[AdminUserValidation] 
    public ActionResult Index() 
    {   
     var account1 = account.GetAccountsWithType(); 
     return View(account1.ToList()); 
    } 

AdminUserValidation.CS

public class AdminUserValidationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (UserSession.Current.IsAdmin == false) 
     { 
      //Prevent access to the controller's method and show error page (bad request/forbidden) 
      filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 
1

あなたは各ユーザーにとても似のUserManagerを使用して役割を割り当てる必要があり、ユーザーの役割です。

User user = UserManager.FindById(userID);  
UserManager.AddToRole(userID, roleID); 

ロールIDはあなたが作成することができます。そこにはroleIDが格納される "AspNetRoles"というデフォルトテーブルがあり、AddToRoleは "AspNetUserRoles"にレコードを挿入します。

コントローラでは、コントローラまたは個々のメソッド全体にアクセスできるロールを指定できます。

[Authorize(Roles = "Admin")] 
public class AdminController : Controller 
{ 
    ... 
} 

ロールがクッキーに保存されるときに、そのロールを有効にするには、ログアウトしてログインする必要があります。私は次のコードを使用して問題を解決し

+0

細かい穀物の承認をさらに希望する場合は、クレームを使用することができます: http://bitoftech.net/2015/03/31/asp-net-web-api-claims-authorization-with-asp-net- identity-2-1/ – DOMZE

+0

ビルドインUserManagerを使用したくないのは、ビルドインデータベースにユーザーを格納する必要があるからです。私は自分のデータベースをユーザーとその役割に使用します。 'UserSession.Current.IsAdmin'変数を使用してこれを検証できる方法はありますか? – DaGrooveNL

+0

UserManagerを別のデータベーススキーマで使用することができます。インタフェースを実装するだけで済みます。残念ながら、私はこれを自分でやっていないので、詳細についてはわかりません。もしあなたがあなたのやり方をしたいなら、if(UserSession.Current.IsAdmin)のようにすることができます { 新しいHttpResponseExceptionを投げる(新しいHttpResponseMessage(HttpStatusCode.Unauthorized)); } base.OnActionExecuting(actionContext); –

関連する問題