web-dev-qa-db-ja.com

ユーザーがMVC5で認証されているかどうかを確認するにはどうすればよいですか?

次の2つのアクセス可能なブール値を見てきました。

  • System.Web.Mvc.Controller.User.Identity.IsAuthenticated
  • System.Web.Mvc.Controller.Request.IsAuthenticated

これらの間に違いはありますか。どちらも同じことをしているように見えるので、どちらを使用するかはわかりません。

私がやりたいことは:

@if (User.Identity.IsAuthenticated) {
  if (User.IsInRole("Admin")) {
    @Html.ActionLink("Admin", "AdminController")        
  }
}

または

@if (Request.IsAuthenticated) {
  if (User.IsInRole("Admin")) {
    @Html.ActionLink("Admin", "AdminController")        
  }
}

上記のどちらも同様に機能しますか?

50
user1679941

違いはありません。唯一の違いは、ユーザーが認証されていない場合はUser.Identityはnullである可能性があり、したがってNREを取得する可能性がありますが、2番目のアプローチでは、内部的にこのチェックが行われ、より安全です。

Request.IsAuthenticatedメソッドが実装されます。

public bool IsAuthenticated
{
    get
    {
        return this._context.User != null && 
               this._context.User.Identity != null &&
               this._context.User.Identity.IsAuthenticated;
    }
}

基本的に、最初のものよりも少し安全です。

65
Darin Dimitrov

現在の要求が認証されているかどうかを判断するIsAuthenticatedプロパティ。認証されていない場合、要求はユーザーがWebアプリケーションに資格情報を入力できる別のページにリダイレクトされます。これは、アプリケーションのデフォルトページで使用される一般的な手法です。

ただし、User.Identity.IsAuthenticatedの場合

Userプロパティは、IPrincipalインターフェイスのプロパティとメソッドへのプログラムによるアクセスを提供します。 ASP.NETページにはSystem.Web名前空間(HttpContextクラスを含む)への既定の参照が含まれているため、HttpContextへの完全修飾クラス参照を使用せずに、.aspxページでHttpContextのメンバーを参照できます。たとえば、User.Identity.Nameを使用して、現在のプロセスを実行しているユーザーの名前を取得できます。ただし、ASP.NETコードビハインドモジュールのIPrincipalのメンバーを使用する場合は、モジュールにSystem.Web名前空間への参照と、現在アクティブな要求/応答コンテキストと使用するSystem.Webのクラス。たとえば、分離コードページでは、完全修飾名を指定する必要があります

3
Amit