2017-03-13 21 views
1

私は、Webサイトの主要な注文部分に進む前に、ユーザーがログインすることを要求する並べ替えシステムを構築しています。たとえば、ユーザーがデータベースに存在する場合、そのIDとUserNameをセッションに割り当てるログインコントローラがあります。コントローラメソッドへのアクセスを制限する

public ActionResult Login(AccountAccess userObj) 
{ 
    if (ModelState.IsValid) 
    { 
     using (SC_DBEntities db = new SC_DBEntities()) 
     { 
      var accountObj = db.Users_Account.Where(u => u.Account_UserName.Equals(userObj.Account_UserName)).FirstOrDefault(); 
      if (accountObj != null) 
      { 
       var accessObj = db.Users_Access.Where(a => a.Account_ID.Equals(accountObj.Account_ID) && a.Access_Password.Equals(userObj.Access_Password)).FirstOrDefault(); 
       if (accessObj != null) 
       { 
        Session["Account_ID"] = accountObj.Account_ID.ToString(); 
        Session["Account_UserName"] = accountObj.Account_UserName.ToString(); 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
     } 
    } 
    return View(userObj); 
} 

ここからやりたいことは、そのSessionがnullの場合、他のメソッドアクションへのアクセスをブロックすることです。たとえば、商品ページにアクセスしたいがログインしていない場合は、ログインページにリダイレクトされます。

私はまだASP.NETにはまだ新しいので、セッション以外の効果をより効率的に実現する方法があれば教えてください。

+0

https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs、http://stackoverflow.com/questions/21231751/authorize-filter-and-authentication始めるのに良い場所です。基本的には、承認アクションフィルタを使用して、アクセスを許可するかどうかを決定します。 – ps2goat

+0

技術的には、「アイデンティティ」はセッションより優れていると思われますが、私もセッションを使用しています。あなたが必要とするのは、あなたの後にユーザーが見つからなかったときに対処する必要があるだけです。あなたが求めているのはそれだけですか? – Rinktacular

+0

@Rinktacular、そうではありません。つまり、誰かがウェブサイトを使っているが、まだログインしていないということです。ホームページからは、ログインページや登録ページへのアクセス方法を選択できます。私が達成しようとしているのは、まだログインしていないホームページを見ている人がいるということです。彼らは注文リンクをクリックしますが、注文ページに転送されるのではなくログインページに転送されます。基本的には、ログインしていない人が他のコントローラメソッドにアクセスするのをやめさせようとしています。 – LittleAngryProgrammer

答えて

4

あなたはActionFilterAttributeを使用することができませんでしたか?

その後
public class CheckSession: ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var MySession = HttpContext.Current.Session 

      if(MySession["Account_ID"] == null || MySession["Account_UserName"]== null) 
      { 
       filterContext.Result = new RedirectResult(string.Format("/Account/")); 
      } 
     } 
    } 

あなたがしなければならないすべてはあなたのコントローラのアクションの上に置いているが - また、そのコントローラ内のすべてを確認するために、コントローラの上に置くことができます:

[CheckSession] 
public ActionResult Purchase() 
{ 
.... 
} 
+0

これは絶対に私が探しているものです。完璧に動作します!どうもありがとうございました! – LittleAngryProgrammer

-1

あなたのコメントに基づいて、あなたが求めている目的のためにセッションを使用することができます。ユーザーがログインすると、上記のようにユーザー名とそのIDを保存します。アクションを実行する前に誰かがログインしていることを確認したい場合は、そのセッション変数がヌルであるかどうかを確認するだけです。あなたのログインコントローラコードと一緒に行く

、あなたが購入コントローラのアクションがあるとします。

public ActionResult Purchase() 
{ 
    //Check to see if these values have been assigned via Login Controller Action 
    if(Session["Account_ID"] == null || Session["Account_UserName"] == null) 
    { 
     //If so, redirect to Controller Action where user can log into. 
     RedirectToAction("Index", "Account") 
    } 
    else 
    { 
     //Make Purchase occur. 
    } 
} 

Identityは、より新しい、より良いログインシステムですが、私の経験ではかなり大きな学習曲線を持っています。セッションにもっと慣れたら、今後のプロジェクトでアイデンティティを調べ始めることをおすすめします。セッションでは何も「間違っていません」。したがって、あなたの目的のために、上記のコードはユーザがログインするために必要なアクションのために機能するはずです。

+0

それは私が見ているもののためにうまくいくでしょう。私はそれを取ることは、私が制限したいすべての行動にそのようなIF声明を添付しなければならないことを意味するでしょうか? – LittleAngryProgrammer

+0

多かれ少なかれ...このコードはどのように "良い"か分かりませんが、過去のプロジェクトでログインを処理する方法としてこれを使用しました。それは意図した目的には効果的でした:) – Rinktacular

+0

OKそれを調べます。助けてくれてありがとう! – LittleAngryProgrammer

2

コントローラまたは特定のアクションに必要な機能を実現するには、カスタムフィルタまたは属性(あなたの場合は認証属性)を使用する必要があります。

開始するために、この良いチュートリアルに見てください。その後https://www.codeproject.com/articles/577776/filters-and-attributes-in-aspnet-mvc

を、あなたはGoogleだけする必要があります。の許可属性のasp.net MVC

関連する問題