2016-07-11 14 views
1

私はクラスCheckSessionTimeOutAttributeを作成しました。セッションタイムアウト時に自動的にログアウトすると、ここで私はreturn urlのメソッドを作成しました。URLとSessionTimeoutがASP .Net MVC 5を使用して正しく動作していませんか?

セッションタイムアウト時に自動的にログアウトすると、URLが返されます。正しい資格情報を書き込むと、Login Controllerの戻り値が返されます。それは2つの戻りURLには行っていません。

また、セッションのタイムアウトとログインページが表示され、ブラウザの戻るボタンを押すと前のページに戻るときに問題が発生する可能性があります。私がログアウトしてもうまく動かない。

http://localhost:1563/?returnUrl=%2FElectricity 

私はそれは行くhttp://localhost:1583/Electricity

のようなURLを返しに行くのではありませんログインしたときhttp://localhost:1563/user

ログインコントローラー:

public ActionResult Index() 
     { 
      ViewBag.Title = "Example.com | Login"; 
      return View(); 
     } 

    [HttpPost] 
      public ActionResult Index(FormCollection fc) 
      { 
       string username = fc["username"].ToString(); 
       string password = fc["password"].ToString(); 
       var query = (from u in db.tbl_user 
          where u.USERNAME == username && u.PASSWORD == password 
          select u).FirstOrDefault(); 
       if (query != null){ 
        Session["username"] = username; 
        Session["login"] = true; 
        return RedirectToAction("Index","User"); 
       } 
       return View("Index"); 
      } 

クラス名CheckSessionTimeOutAttribute

[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
    public class CheckSessionTimeOutAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (HttpContext.Current.Session["login"] == null) 
      { 
       FormsAuthentication.SignOut(); 
       filterContext.Result = 
       new RedirectToRouteResult(new RouteValueDictionary 
       { 
      { "action", "Index" }, 
      { "controller", "Login" }, 
      { "returnUrl", filterContext.HttpContext.Request.RawUrl} 
        }); 

       return; 
      } 
     } 
    } 

のweb.config:

<sessionState mode="InProc" timeout="1" cookieless="false"></sessionState> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Login" timeout="1"> 
     </forms> 
    </authentication> 
+0

ログインコントローラを表示するインデックス取得アクション –

+0

@EhsanSajjad、ログインコントローラのインデックス取得機能を追加しました。 –

+0

ご使用のモデルにFormCollectionを使用しないでください。また、TempDataを使用することは最適ではありません。私はまもなく答えを投稿します! –

答えて

0

MVCを使用しているため、コントローラメソッドに渡されるモデルとしてFormCollectionを使用することはお勧めしません。 MVCパターンを守ることは、特にアプリケーションがより複雑になるにつれて、多くのことを単純化するのに役立ちます。だからあなたのログインモデルで開始できます:あなたはあなたの[Required][DataType][HidenInput]のような属性を持つモデルの特性を飾るする必要はありません

using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

namespace YouProjectName.Models 
{ 
    public class AccountLoginModel 
    { 
     [Required] 
     public string Username { get; set; } 

     [Required] 
     [DataType(DataType.Password)] 
     public string Password { get; set; } 

     [HiddenInput(DisplayValue = false)] 
     public string ReturnUrl { get; set; } 
    } 
} 

が、私はあなたにいくつかの異なる方法が表示されますように私は非常にそれらを使用することをお勧めしますビューをレンダリングすることもできます(必要な属性を追加することを強くお勧めします。コントローラで必須のフィールドを個別にチェックする必要はありません)。そうは言って

、我々はコントローラのメソッドでモデルを扱うことができる方法を見てみましょう:Index方法の

[HttpGet] 
public ActionResult Index(string returnUrl = "") 
{ 
    return View(new AccountLoginModel {ReturnUrl = returnUrl}); 
} 

[HttpPost] 
public ActionResult Index(AccountLoginModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 

    var query = (from u in db.tbl_user 
       where u.USERNAME == model.Username && u.PASSWORD == model.Password 
       select u).FirstOrDefault(); 
    if (query != null){ 
     Session["username"] = model.Username; 
     Session["login"] = true; 

     if (!string.IsNullOrWhiteSpace(model.ReturnUrl)) 
     { 
      return Redirect(model.ReturnUrl); 
     } 

     return RedirectToAction("Index", "User"); 
    } 

    ModelState.AddModelError("", "Username and/or Password is incorrect"); 
    return View(model); 
} 

[HttpGet]バージョンはしばらくの間、ビューにモデルの新しいインスタンスを渡しますメソッドに渡されるreturnUrlパラメータも取得します。 Indexメソッドの[HttpPost]バージョンでは、最初にModelState.IsValidをチェックします。 [Required]とマークされたモデルのすべてのプロパティがここで検証されます。有効でない場合は、モデルをビューに戻すだけでエラーメッセージが表示されます。最後に、model.ReturnUrlが空であるかどうかを確認してください。そうでない場合は、UserControllerにリダイレクトしない場合は、その値にリダイレクトします。

ビューでは、いくつかのオプションがあります。あなたのモデルプロパティを飾るために、属性を使用した場合、あなたはこのような単純なもの行うことができます:@Html.EditorForModel()の呼び出しで

@model YouProjectName.Models.AccountLoginModel 

@{ ViewBag.Title = "Example.com | Login"; } 

@Html.ValidationSummary() 

@using (Html.BeginForm()) 
{ 
    @Html.EditorForModel() 
    <button type="submit">Submit</button> 
} 

を、かみそりのビューには、モデルのプロパティを見て、適用される属性に基づいて、それらをレンダリングします各プロパティに。あなたはこの方法でそれを行う必要はありません。各入力を手動で追加して、HTML要素のレイアウトを完全に制御することができます。このような何か(TwitterのブートストラップCSSを使用していますちょうど例):

@model YouProjectName.Models.AccountLoginModel 

@{ ViewBag.Title = "Example.com | Login"; } 

@Html.ValidationSummary() 

@using (Html.BeginForm("Index", "Login", FormMethod.Post)) 
{ 
    <div class="row"> 
     <div class="col-md-1"> 
      @Html.LabelFor(x => x.Username) 
     </div> 
     <div class="col-md-4"> 
      @Html.TextBoxFor(x => x.Username) 
     </div> 
    </div> 
    <div class="row"> 
     <div class="col-md-1"> 
      @Html.LabelFor(x => x.Password) 
     </div> 
     <div class="col-md-4"> 
      @Html.PasswordFor(x => x.Password) 
     </div> 
    </div> 
    @Html.HiddenFor(x => x.ReturnUrl) 
    <button type="submit" class="btn btn-primary">Submit</button> 
} 

ここで重要な部分は、フォームの内側にreturnurlため@Html.HiddenFor()を追加することを確認することです。このようにして、リターンURLは残りのプロパティと共にポストされます!

+0

あなたの貴重な時間に感謝@Bobby Caldwell、実際に私は新しいASP MVCパターンですので、私はそれについて全く考えていません。私に素晴らしいアイデアを与えてくれてありがとう。私は別の問題 'Session Timeout'を持っています。私は上記のweb.configファイルを参照しています。問題は、セッションタイムアウトを15に設定していても、数秒でセッションタイムアウトが自動的に発生することです。セッションタイムアウトを適切な方法で設定するにはどうすればよいですか?あなたは私にあなたのアイデアを教えてくれますか? –

+0

これはおそらくあなたのカスタムCheckSessionTimeOutAttributeと関係があります。 MVCは、ユーザーセッションの期限が切れると自動的にreturnUrlをURLに追加するので、CheckSessionTimeOutAttributeを削除しても問題ありません。 timeoutを2880に設定してみてください。タイムアウトのカスタム属性を削除し、http:// localhost:1583/Electricityに移動して手動でクッキーを削除してみてください(クッキーを削除するとlocalhostを検索します。あなたのクッキー!)ページを更新してください。あなたのために自動的にreturnUrlが追加されます! –

1

@Manish、以下のように変更ログインコントローラ。

public ActionResult Index(string returnUrl = "") 
    { 
     ViewBag.Title = "Smartmultiservices.in | Login"; 
     if (!string.IsNullOrWhiteSpace(returnUrl)) 
     { 
      TempData["returnUrl"] = returnUrl; 
     } 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(FormCollection fc) 
    { 
     string username = fc["username"].ToString(); 
     string password = fc["password"].ToString(); 
     var query = (from u in db.tbl_user 
        where u.USERNAME == username && u.PASSWORD == password 
        select u).FirstOrDefault(); 
     if (query != null) 
     { 
      Session["username"] = username; 
      Session["login"] = true; 
      if (TempData["returnUrl"] != null && !string.IsNullOrWhiteSpace(TempData["returnUrl"].ToString())) 
       return Redirect(TempData["returnUrl"].ToString()); 
      else 
       return RedirectToAction("Index", "User"); 
     } 
     return View("Index"); 
    } 
+0

ありがとう@ウェルズ、それは働いています。私は 'web.config'ファイルに上記で述べたような別の問題があります。私はセッションタイムアウト15を設定していますが、数秒で自動的にセッションのタイムアウトが発生します。何をすべきか ?私を助けてください。 –

関連する問題