2016-10-31 3 views
0

私は私のコントローラの設計でアクションを持っています。まだ認証されていない場合は、LOGINページにリダイレクトしてください。推測するために対応するコントローラのアクションを設計し、許可ユーザーはどのように

しかし、匿名ユーザーがページのデモのように見えるように、ページにアクセスするためのダミー関数getFakeData()も持っていたいと思います。

ここで、ユーザーが認証されているかどうかを確認してその動作を変更する必要がありますか?

  1. ウェブページでは、ユーザーが認証されているかどうかに基づいてdataUrlを設定できます。私は[Authorize]タグ

    @if (Request.IsAuthenticated) 
    { 
        dataUrl = '=/Project/Controller/getUserData' 
    } else { 
        dataUrl = '=/Project/Controller/getFakeData'  
    } 
    
  2. あるいは、ユーザが認証されているかどうか、私は同じアクションコントローラでそれを行うと確認することができずに機能分離を行うことができますか?しかし、それが可能であるかどうかは分かりません。

  3. これを行うより良い方法はありますか?

+1

もう一つの選択肢は、ログインページで、 '[AllowAnonymous]' –

+0

@StephenMueckeとマークされている '偽の'データを生成するメソッドにリダイレクトするリンクを作成することです。ユーザーが匿名であるか、すでに認証されている場合 –

+0

ユーザーは、ログインページに直接リダイレクトされていない限り、ログインページに直接リダイレクトされませんでした( –

答えて

1

は、これを行うための様々な方法がありますが、ここで追加したヘッダを読み、ControllerContextへのアクセスがないASP.Netコアに(ビューをカスタマイズすることができ、あなたのビューで私の推薦

// For ASP.Net MVC 5 simply inherit from AuthorizationAttribute and override the methods. 
public class AccessControlAttribute : Attribute, IAuthorizationFilter 
{ 
    private readonly Roles role; 
    public AccessControlAttribute(Roles role) { 
     this.role = role; 
    } 
    private Boolean AuthorizationCore(AuthorizationFilterContext context) { 
     var username = context.HttpContext.Request.Cookies["loginCookie_username"]; 
     var password = context.HttpContext.Request.Cookies["loginCookie_password"]; 
     if (role == Roles.FakeFullAccess) { 
      username = "FAKE"; 
      goto final; 
     } 
     //In ASP.Net MVC 5 use Ninject for dependency injection and get the service using : [NinjectContext].GetKernel.Get<DbContext>(); 
     DbContext db = (DbContext) context.HttpContext.RequestServices.GetService(typeof(DbContext)); 
     if (username != null && password != null) { 
      var findUser = db.Set<Login>().Find(username); 
      if (findUser != null && findUser.Password.Equals(password) && findUser.RoleId == (int)role) { 
       goto final; 
      } 
     } 
     return false; 
     final: { 
      context.HttpContext.User.AddIdentity(new System.Security.Principal.GenericIdentity(username)); 
      return true; 
     } 
    } 
    private void HandleUnauthorizedRequest(AuthorizationFilterContext context) { 
     context.Result = new RedirectToRouteResult(new { 
      area = "", 
      controller = "", 
      action = "" 
     }); 
    }   
    public void OnAuthorization(AuthorizationFilterContext context) 
    { 
     if (AuthorizationCore(context)) 
     { 
      // If using a combination of roles, you have to unmask it 
      if (role == Roles.FakeFullAccess) { 
       context.HttpContext.Request.Headers.Add("Render", "FakeAccess"); 
      } 
      else if (role == Roles.Admin) 
      { 
       context.HttpContext.Request.Headers.Add("Render", "AdminAccess"); 
      } 
     } 
     else { 
      HandleUnauthorizedRequest(context); 
     } 
    } 

} 
[Flags] 
public enum Roles 
{ 
    FakeFullAccess = 0, 
    ReadOnly = 1, 
    Admin = 2, 
    Supervisor = 1 << 2, 
    AnotherRole = 1 << 3 
} 

ですそしてViewBag、ASP.Net MVC 5を使用した場合は、ヘッダーのトリックを使用する必要はありません)

// For ASP.Net MVC 5 use the ViewBag or ViewData 
@Html.Partial(HttpContext.Request.Header["Render"]) 
//Assuming this renders the menu with proper functions. 

は今、あなたは、テストのために偽のアクセス権を持つ完全にカスタマイズ可能な役割ベースの認証システムを持っています。

更新: 属性を消費するには、次の

[AccessControl(Role.Admin)] 
public TestController: Controller { 
    ... 
} 
// Dedicated for testing 
[AccessControl(Role.FakeAccess)] 
public PreviewController: TestCoontroller{} 

を行う[AccessControl(Role.FakeAccess | Role.ReadOnly)]のように必要な場合にも、役割を組み合わせることができますが、マスク解除方法を実装する必要があります。

+0

匿名ユーザーにどの段階で偽の役割を割り当てるか? –

+0

は、最初に 'uthorizationCore'メソッドとgoo 3行に注意してください。 – Transcendent

+0

あなたは 'role == Roles.FakeFullAccess'を比較しますが、ロールをどこで初期化するのか分かりません。 –

関連する問題