2013-09-03 40 views
27

ASP.NET 4の内部Webアプリケーションが組み込まれています。私たちは、別のチームによって構築された認証APIを使用することに固執しています。サイトのユーザーがサイトで正常に認証された場合は、サイト全体へのアクセス権を付与したいと考えています。カスタム認証とASP.NET MVC

ASP.NET WebForm日私はちょうどカスタムのユーザーオブジェクトをセッションに保持していました。そのオブジェクトがnullだった場合、私はそのユーザーが認証されていないことを知っていました。これに似ていますが改善された方法がMVCにありますか?可能であれば、ASP.NETメンバーシップモデルの独自のプロバイダを構築する必要はありません。これを行う最も簡単な方法は何ですか?

+1

レガシーAPIを呼び出した後、認証チケットを手動で設定するだけで済みませんか? – TheKingDave

+1

'FormsAuthenticationTicket'が設定されている場合は、' Request.IsAuthenticated'と 'User.Identity'を使ってユーザがログインしているかどうかを判断できます。また、' Authorize'属性も機能します。 –

+3

FYIでは、セッションで認証を処理することは非常に悪い考えです。セッションはいつでもリサイクルできるため、安全ではありません(クッキーは暗号化されず簡単に盗まれます)。代わりにFormsAuthenticationを使用してください –

答えて

5

おそらくカスタムauthorization filterが必要です。例はCustom filters in MVCです。このフィルタは、アプリケーションの起動時にグローバルに適用できます(RegisterGlobalFiltersを使用)。

GlobalFilters.Filters.Add(new LegacyAuthorize()); 
+0

Authorize属性をオーバーライドすると、特にセッションの検証のみが危険です。セッションIDは再生成されないため、XSSなどによるセッションハイジャックにつながる可能性があります。http://blog.securityps.com/2013/06/session-fixation-forms-authentication.htmlおよびhttps://support.microsoft。 com/ja-kr/kb/899918 – PJH

1

あなたはMVCで行うことができます形式で行うことができるすべて、単にコントローラのログインアクションでセッション変数を設定します。

public class LegacyAuthorize : AuthorizeAttribute 
{ 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
    if (HttpContext.Current.Session["User"] == null) 
     base.HandleUnauthorizedRequest(actionContext); 
    } 
} 

次に、あなたのglobal.asaxにあなたはこのような何かを持っていると思います。

それとも、これを行うことができます。現在のユーザーを許可します。この後は、[承認]キーワードで任意のアクションをformsauthentication.setauthcookie("username")

を追加ログインアクションで を

3

あなたはこのような何かを試すことができます。

FormsAuthentication.SetAuthCookie(username, rememberMe); 

だけで認証を必要とするコントローラまたはアクションに[Authorize]属性を使用し、その後、認証されたユーザーのためにクッキーを設定します。

詳細については、グーグルグーグルで調べてみてください。MVCの認証と承認には多くのものがあります。

次のように、ビューへのアクセスを制限するには、 Authorize attibuteと接続詞に

Forms Authenticationを使用することができます

42

以下に示すように、アクションメソッドの宣言に

[Authorize] 
public ActionResult Index() 
{ 
    return View(); 
} 
をAuthorizeAttribute属性を追加します。

web.configでのフォーム認証の設定

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

ログイン後の処置: 設定された認証クッキー、ユーザーがアクションをログオフ

[HttpPost] 
public ActionResult Login(User model, string returnUrl) 
{ 
     //Validation code 

     if (userValid) 
     { 
      FormsAuthentication.SetAuthCookie(username, false); 
     } 
} 

有効である場合:

public ActionResult LogOff() 
{ 
    FormsAuthentication.SignOut(); 
    return RedirectToAction("Index", "Home"); 
} 
+0

アプリ全体のすべてのコントローラメソッドに[Authorize]を設定する必要がありますか?私は匿名ユーザー(〜/アカウント/ログインGETとPOST)に2つのコントローラメソッドを開きたいだけです。より良い方法があるように見えます。これにはフィルタが必要ですか?カスタム属性?ご協力いただきありがとうございます。 +1 – BuddyJoe

+3

この場合はこちらhttp://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx –

+0

なぜですか新しいASP IDは 'FormsAuthentication'と同じくらい単純でしょうか? https://www.asp.net/identity –

-2

ログインがあるときは、単純にセッション変数の値を置くことによって、セッション認証を行うことができます成功した。たとえば、

public ActionResult Index(Models.Login login) 
    { 
     if (ModelState.IsValid) 
     { 
      Dal.Login dLogin = new Dal.Login(); 
      string result = dLogin.LoginUser(login); 
      if (result == "Success") 
       Session["AuthState"] = "Authenticated"; 
     } 
     return View(); 
    } 

ここで、認証を確認する必要があるすべてのビューの共通レイアウトページが必要です。このレイアウトページでは、このようなかみそりチェックをします。 -

<body> 
    @if (Session["AuthState"] != "Authenticated") 
    { 
     Response.Redirect("~/login"); 
    } 
    // other html 
</body> 

私はアプリケーション管理パネルでこのメソッドを使用しています。

+0

この方法は危険であり、セッション固定またはセッションハイジャック攻撃を引き起こす可能性があります。 セッションIDは決して更新されません。 短所の簡単な説明については、こちらの記事を参照してください。 tl; dr;ログインしたセッションに固有で、理想的にはセッションに結びついている認証Cookieが必要です。 http://blog.securityps.com/2013/06/session-fixation-forms-authentication.html – PJH