0

フォーム認証を強制するために、ほとんどのコントローラーが Authorize 属性で装飾されている ASP.NET MVC Web サイトがあります。

Facebook アプリを介してこの Web サイトを Facebook で利用できるようにしようとしていますが、FB ユーザーには別の認証/承認を使用したいので、コントローラーで CanvasAuthorize 属性を使用したいと考えています。

問題は、コントローラー/アクションで両方を使用できないことです。これは、両方が関連するアクションにアクセスするために強制されるためですが、通常の Web サイトには Authorize のみが必要で、Web サイトにアクセスしたときに CanvasAuthorize のみが必要です。 FBから(FBアプリ経由)。

私は始めました

  1. 既存のコントローラーを「controllerhelpers」に大幅にリファクタリングする
  2. 既存のコントローラーを (authorize 属性を使用して) 作成し、controllerhelpers に関連するメソッドを使用します。
  3. 関連する controllerhelper メソッドも使用する FB アプリ用の新しいコントローラー (CanvasAuthorize で装飾) を作成します。

しかし、これは膨大な作業であり、これが進むべき道なのか、それとももっと簡単で洗練された作業方法があるのか​​ はわかりません。

もちろん、同じビューを使用したいのですが、cshtmls では特定のコントローラーの Url.Action メソッドを使用しているため、cshtmls にアクションパスを挿入するときの現在のアプローチ (たとえば、jQuery ajax Url プロパティ)たとえば、通常の Web サイトを使用する場合は「PersonalController」を使用し、Web サイトを FB アプリとして使用する場合は「FBPersonalController」を使用する if ステートメントを作成する必要があります。

この場合、PersonalController は [Authorize] で装飾され、FBPersonalController は [CanvasAuthorize] で装飾されます。

だから、どんなフィードバックでも大歓迎です;)

ありがとう!

4

2 に答える 2

0

Xoyojaの答えは私をこの解決策に導きました。私はそれを評価しているので、それを「受け入れられた答え」としてマークしませんが、多分それは議論する価値があります:

いいえ、すべてを装飾する必要はありません。しかし、あなたの提案で、私は次のようになりました:

IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions =
                new Func<ControllerContext, ActionDescriptor, object>[] { 

                    (ctrlCtx, actDesc) =>
                        {
                            if(FacebookWebContext.Current.SignedRequest != null)
                            {
                                return new CanvasAuthorize();
                            }
                            else
                            {
                                if(ctrlCtx.Controller.GetType() == typeof(AccountController)
                                    && actDesc.ActionName == "LogOn")
                                {
                                    return null;
                                }
                                return new AuthorizeAttribute();
                            }
                        },
            };

私のウェブサイトにFBからアクセスすると、SignedRequestがnullではないように見えるので、CanvasAuthorizeを使用できます。

私のウェブサイトが通常の公開されたURLからアクセスされる場合、私はAuthorizeAttributeを使用します。

パブリックURLからWebサイトにログインできるようにするには、AccountControllerと「LogOn」アクション固有のロジックが必要です。Facebookから、コンテキストには、暗黙的に認証を行うFacebookUserIDが含まれます。

これが私に害を及ぼす可能性があるかどうかにかかわらず、私はまだ影響、最悪のシナリオ、バックドアについて考えています。

于 2012-03-29T15:43:10.557 に答える
0

[Authorize] と [CanvasAuthorize] の両方をサポートする条件付きフィルターを使用できますか? 簡単な ASP.NET MVC3 アプリケーションでテストしたところ、動作します。役立つと思いますか?

一方、設計を変更できれば、認証を 1 か所にまとめること、つまり、FormsAuthenticationService、FacebookAuthenciationService、および OpenIDAuthencitationService が「IAuthenticationService」と呼ばれるインターフェイスを実装することをお勧めします。Facebook OAuth フローが完了したら、標準の FomsAuthentication.SetAuthCookie メソッドを呼び出します。その後、Authorize 属性が適切に機能するはずです。この質問を参照し、ここからコード スニペットを確認してください(Create.aspx および SessionController.cs)。評価してください。

于 2012-03-29T05:44:14.220 に答える