2016-04-29 9 views
0

嫌い、AuthorizeAttributeは一度だけ呼び出されます

私は自分のカスタムathorizeattributeを作成しました。この属性を持つ最初のアクション結果の直後に1回だけ発生します。しかし、私がその同じ行動に進むことを試みると、それは機能します(セキュリティ違反につながる可能性があります)。

コントローラー:

[AuthenticationController.IsLoggedInAsHero] 
public ActionResult Hero() 
{ 
    return View(); 
} 

AuthenticationController:

public class IsLoggedInAsHero : AuthorizeAttribute 
    { 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (!isAuthenticatedAsHero()) 
      { 
       filterContext.Result = new RedirectToRouteResult(
              new RouteValueDictionary(new { controller = "Account", action = "Login" }) 
            ); 
      } 
     } 
    } 

isAuthenticatedAsHero():

public static bool isAuthenticatedAsHero() 
{ 
    User user = new User(); 
    user = udc.GetUserByCookie(); 
    if (user.Hero== 1 && System.Web.HttpContext.Current.User.Identity.IsAuthenticated) 
    { return true; } 
    else return false; 
} 

ヘルプは歓迎です!これはあなたのソリューションですが、私の知る限りが思うように、このメソッドをオーバーライドする必要がある場合

+1

「同じ行動に出ようとするとうまくいく」とはどういう意味ですか?あなたが望むものではありませんか? –

+0

ああ、申し訳ありませんが、私はそこにうんざりしていると思います。だから初めて私は拒否され、二度目には私は両方のアクセスが拒否されるべきであると(同じユーザー情報で)承認されます。 – Kraishan

+0

isAuthenticatedAsHero()関数の実装に依存するように見えますか?あなたはこの機能を共有できますか? –

答えて

1

は私はわからない:

protected override bool AuthorizeCore(HttpContextBase httpContext){ 
    return isAuthenticatedAsHero(); 
} 

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
     filterContext.Result = new RedirectToRouteResult(
           new RouteValueDictionary(new { controller = "Account", action = "Login" }) 
          ); 
} 
+0

返信いただきありがとうございます。私は私の認証を動的にしたいので、私はまた、複数の形の役割(例えばヒーローズと悪人)を扱いたいと思っています。あなたのソリューションはisAuthenticatedAsHero()を返すので、あなたのソリューションはそれを許可しません。 – Kraishan

1

聞かせた方がよいです許可されていないリクエストを処理するための基本クラス。ユーザーが権限がない場合は401ステータスコードを返します。 ASP.Netフレームワークでは、Webサイトでフォーム認証が有効になっているかどうかがチェックされ、自動的にログインページにリダイレクトされます。

のでごIsLoggedInAsHeroクラスは、この

public class IsLoggedInAsHero : AuthorizeAttribute 
    { 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (!isAuthenticatedAsHero()) 
      { 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
     } 
    } 

のようになります。そして、あなたはあなたのweb.configファイルでフォーム認証を有効にする必要があります。

<authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login" /> 
</authentication> 
+0

そうでないものにアクセスしようとするたびに、すべてを再ログインするようにすると、これは問題ありません。しかし、それをエラーページに送ったり、制限されたアクセスを説明するメッセージをポップアップしたりしたいのであればどうでしょうか? Opの頭が正しい方向にあり、達成しようとしているものを容易にするのに役立つ以下のコードも含まれています。 –

0

ほとんどのシステムでは、通常、「ダッシュボード」と呼ばれるユーザーのために分割された領域があります。ここではそのための承認のための私の例です:

public class DashBoardAuthorizeAttribute : AuthorizeAttribute 
    { 
     /// <summary> 
     /// Handles the unauthorized request. 
     /// </summary> 
     /// <param name="context">The context.</param> 
     protected override void HandleUnauthorizedRequest(AuthorizationContext context) 
     { 
      var newName = "UserContext" + HttpContext.Current.User.Identity.Name; 
      var cache = MemoryCache.Default; 
      var userContext = cache.Get(newName) as IUserModel; 
      if (userContext != null && !userContext.DashBoardAccess) 
      { 
       var urlHelper = new UrlHelper(context.RequestContext); 
       var address = urlHelper.Action("Index", "Home"); 
       context.Result = new RedirectResult(address ?? "login"); 
      } 
      else 
      { 
       base.HandleUnauthorizedRequest(context); 
      } 
     } 
    } 

そして、私のコントローラ上またはindiviualアクションで:

[DashBoardAuthorizeAttribute] 
public async Task<ActionResult> GetUsers(){ 
return View(); 
} 

何らかのアクションが毎回実行される前に、これが実行されます。将来のプロジェクトでは、命名規則を再評価する必要があります。私がこのプロジェクトであなたを手伝ってくれる他の開発者だったら、コードを開いて見ていない限り、 "IsLoggedInAsHero"が何をしているのか分からないでしょう。命名規則は、開発の容易さのために、それが何であるか基本的なことを伝えるべきです。 "DashBoardAuthorizeAttribute"を使用すると、別の開発者は、 "ダッシュボード"に関する承認属性とみなすことができます。

+0

返信いただきありがとうございます。しかし、それは私がすでに持っているものではありませんか? authorizeattributeとoverhandiddenauthroizedrequest?途中でASp.NETの認証を使用していませんが、それが問題なのかどうかはわかりません。 – Kraishan

+0

すべてのアクションの上にあなたの属性がありますか?それともコントローラの上部にありますか?それをコントローラーの上に置くと、そのたびにヒットするすべてのシングルアクションが発生します。たぶん、Asp.Net認可を使用しないでください。私はほとんどの時間それを使用しないでください。 –

+0

私は毎回その行動の上にそれを持っています。私は今日の午後にコントローラの上に置いてみるつもりです。 – Kraishan

関連する問題