2016-04-01 20 views
2

にユーザーIDを取得し、たとえば、ASP.NET Web APIをコントローラのコンストラクタでユーザーIDを取得するには良いアイデアです:ASP.NETのWeb APIは、コントローラのコンストラクタ

public PagesController(PageValidator pageValidator, PageMapper pageMapper, PagesManager pagesManager, UsersManager usersManager) 
      :base(usersManager) 
     { 
      _pageValidator = pageValidator; 
      _pageMapper = pageMapper; 
      _pagesManager = pagesManager; 
      if (User.Identity.IsAuthenticated) 
      _pagesManager.UserId = usersManager.GetByEmail(User.Identity.Name).Id; 
     } 

はUser.Identityはこの前人口正しかった常にです電話をかける?

答えて

1

はい。このプロパティはController内の任意の場所で使用できます。 ASP.NETには要求パイプラインがあります(http://www.dotnetcurry.com/aspnet/888/aspnet-webapi-message-lifecycle)。 「認可」はリクエストパイプラインの初期段階です。 コントローラの作成は最新の段階です。

+0

コントローラの作成は最新の段階ではありません。コントローラはフィルタの前に作成され、コントローラ*メソッド*は – Aleks

+0

の後にアクセスされます。正しいです。ただし、フィルタはASP.NETパイプラインに関係しない追加の要求パイプラインです。また、作成したコントローラの後に、リクエストを検証できるロジックをアクションメソッドに追加することができます。 –

+0

質問は「それは良いアイデアですか?」と回答はノーです。 OPは*どのように*認証が実行されているかについては言及していません。それがホストによって行われるかフィルターによって行われるかにかかわらず、アイデンティティは引き続き同じ方法でアクセスされます。つまり、ある時点で認証メカニズムを変更する場合、コントローラを奇妙で素晴らしい方法で壊すことになります。 – Aleks

1

これは私を数回噛んだ。あなたの認証をどこでやっているかに応じて、あなたの身元にアクセスする場所はコントローラのコンストラクタで特にであることに注意する必要があります。 IAuthenticationFilterがインスタンス化された後、コントローラ作用が呼び出され、一方、例えば、コントローラのコンストラクタAuthenticateAsync呼ばれる

。つまり、AuthenticateAsyncで行う認証は、あなたのコントローラのコンストラクタでは使用できません(例のように)。

私は通常、(DIで処理されない限り)コントローラの構築中に利用可能なものに依存しません。代わりに、コントローラの操作で必要に応じてIDにアクセスしてください。

ID照合を容易にする(つまり、User.Identity.Nameプロパティに基づいてユーザーオブジェクトを取得する)場合は、それを行うプロパティまたはメソッドを持つベースコントローラクラスを作成し、コントローラにそのプロパティを継承させます...

public User AuthenticatedUser 
{ 
    get 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      return usersManager.GetByEmail(User.Identity.Name); 
     } 

     return null; 
    } 
} 

EDIT

認証前に発生したコントローラの作成を示し、Web.APIライフサイクルの詳細な内訳についてはhereを参照してください。

+0

戻るusersManager.GetByEmail(User.Identity.Name); - このコードはNull参照例外を設定できます。 –

+0

そうです。 User.Identityがまだ設定されていないときにコンストラクタで呼び出されたときと同じことができます。 – Aleks

+0

同じではありません。チェックがあります:if(User.Identity.IsAuthenticated) –

関連する問題