0

MVC3 アプリで認証を実装するさまざまな方法を検討しています。独自のコードを使用して認証を行いたいのですが、ASP.NET MVC を使用してログオン システムを作成することは可能ですが、MembershipProvider を使用することはできません。 (他の方法があることは知っています。)これらの方法のいずれかを使用してユーザーを認証したら、コントローラーコンストラクターにユーザー情報を取得する方法を知りたいです。(ユーザー情報とは、ユーザー名またはユーザーIDを意味します)。

私が検討したオプションの 1 つは、その情報をSession. これは機能しますが、テスト中に存在しないを取得するSessionため、テストが困難です。Context

ユーザー情報をコントローラーコンストラクターに渡す方法についてのアイデアをいただければ幸いです。

4

2 に答える 2

0

私の元の投稿では、ユーザー情報をControllerコンストラクターに渡すことを検討していました。Controllerをに依存させたくありませんでしたHttpContext。テストが困難になるからです。

Mystere Manの解決策に感謝しますが、次の別の解決策が誰かの役に立てば幸いです。私は小さなプロジェクト(約 12 個のコントローラー)を持っているので、それほど悪くはありません。

私は基本的にカスタムControllerFactory継承を作成しましたDefaultControllerFactory

public class MyCustomControllerFactory : DefaultControllerFactory
    {
        public MyCustomControllerFactory ()
        {
        }


        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
            {
                return null;
            }
            else
            {
                //Example of User Info - Customer ID
                string customerIDStr =  requestContext.HttpContext.Session["CustomerID"].ToString();
                int customerID = Int32.Parse(customerIDStr);

                //Now we create each of the Controllers manually
                if (controllerType == typeof(MyFirstController))
                {
                    return new MyFirstController(customerID);
                }
                else if (controllerType == typeof(MySecondController))
                {
                    return new MySecondController(customerID);
                }
                //Add/Create Controllers similarly
                else //For all normal Controllers i.e. with no Arguments
                {
                    return base.GetControllerInstance(requestContext, controllerType);
                }
            }
        }
    }

次にControllerFactoryGlobal.asax.cs Application_Start()メソッドに を設定します。

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory ());
        }

PS Ninject のような DI コンテナーの使用を検討しましたが、現在のプロジェクトには複雑すぎると思います。それらを使用することが本当に理にかなっているとき、私は数ヶ月でそれらを見るでしょう.

于 2012-10-16T21:52:31.487 に答える
0

いいえ。認証にセッションを使用しないでください。安全性が低く、不安定です (セッションはサーバーによって自由に破棄される可能性があります)。

MVC では、メンバーシップをまったく使用する必要はありませんが、.. 強調しておきますが.. 認証を正しく行うことは簡単な作業ではありません。それを間違えて、それに気付かないことは非常に非常に簡単です。何をしているのか分かっていても。これは、徹底的に分析、テスト、検証、および再分析する必要があるものです。

この作業を延長したくない場合は、おそらくデフォルトのプロバイダーを使用することをお勧めします (選択できるプロバイダーがいくつかあります)。

しかし、いずれにせよ、自分でやろうと決心した場合、必要なのはユーザーを確認する何らかの方法だけです。MVC は、WebForms のようにメンバーシップ プロバイダーと統合しません。便利に使っています。AccountControllerインターネット プロジェクトを作成する場合に生成される既定値を見ると、それが行うのは の呼び出しだけMembership.VerifyUser()です。

FormsAuthentication本当に重要なのは、MS がクラスの形で提供する認証 Cookie システムです。自分が何をしているのかを本当に本当に本当に知っている場合を除き、Cookie の管理にこれを使用することを強くお勧めします。

を見るだけで、AccountControllerこれがどのように機能するかは非常に明白です。 FormsAuthenticationアプリに統合され、ユーザーが既に認証されていることを asp.net に伝える部分です。安全な暗号化された Cookie を使用し、適切に設計されています (独自の追加データを暗号化された形式で保存することもできます)。

フォーム認証は、連携して透過的な認証メカニズムを提供する一連のクラスであり、MVC および Asp.net WebForms に統合されています。これらは基本的に、asp.net に不可欠な IPrincipal および IIdentity システムの実装です (User.IsAuthenticatedこれを入力すると、IPrincipal インターフェイスが使用されます)。

于 2012-10-16T16:01:00.043 に答える