MVC 5 ASP.NET Identity 2:捕获用户对ExternalLogin中“记住我”的偏好

时间:2014-04-24 20:36:16

标签: asp.net-mvc-5 owin remember-me asp.net-identity-2

我正在使用Identity 2.0示例。

我通过在ExternalLoginCallback操作方法中将isPersistent设置为true来获得该功能,浏览器将在下次使用相同浏览器访问时(在限制范围内)自动记录用户。我知道,如果用户记得我"捕获了首选项并将其传递给ExternalLogin操作方法,该方法可以放入returnUrl并在ExternalLoginCallback中访问。但是我如何获得他们对ExternalLogin操作方法的偏好?

在这种情况下,我不知道如何在LoginView页面上放置一个复选框并连接起来,以便我可以在ExternalLogin操作方法中处理它。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:4)

查看AccountController.ExternalLoginConfirmation操作,并记下对await SignInHelper.SignInAsync(user, isPersistent: false, rememberBrowser: false)的来电。您可以将这些值设置为true,也可以更新ExternalLoginConfirmationViewModel和相应的ExternalLoginConfirmation视图,以便用户决定。

顺便说一句:isPersistent将持续关闭用户会话并重新打开浏览器。 rememberBrowser参数特别适用于双因素身份验证,听起来应该因为您的情况而假。

切线相关的Supporting remember me with two factor authentication

答案 1 :(得分:1)

不要删除任何代码,只需更改如下:

在AccountViewModels中,编辑以匹配:

public class ExternalLoginViewModel 
    {
        public string Action { get; set; }
        public string ReturnUrl { get; set; }
        public string RemembermeExtnl { get; set; }
    }

在帐户控制器中,编辑以匹配:

public ActionResult Login(string returnUrl)
    {   
        ViewBag.ReturnUrl = returnUrl;
        ViewBag.RemembermeExtnl = "f";
        return View();          
    }

public ActionResult ExternalLogin(string provider, string returnUrl, string remembermeExtnl) 
    {
        // Request a redirect to the external login provider
        return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl, remembermeExtnl = remembermeExtnl }));
    }


public async Task<ActionResult> ExternalLoginCallback(string returnUrl, string remembermeExtnl)
    {
    ...
        var result = await SignInHelper.ExternalSignIn(loginInfo, isPersistent: remembermeExtnl=="t"); 
    ...
    }

在“登录”视图中,编辑以匹配:

<section id="socialLoginForm">
    @Html.Partial("_ExternalLoginsListPartial", new PG.Models.ExternalLoginViewModel() { Action = "ExternalLogin", ReturnUrl = ViewBag.ReturnUrl, RemembermeExtnl = ViewBag.RemembermeExtnl })                
     <input type="checkbox" id="cbxRemExt" />  Remember me  
</section>

在“登录”视图中,添加以下内容:

<script>
// ** change to eq(1) (2 places!) if your social login form is the second form on the page,
//  keep as below if first form is your social login form **
  $("#cbxRemExt").change(function () {
      var isChecked = $(this).is(":checked");
       var actionstring = $('form').eq(0).attr('action');          
       actionstring = actionstring.replace('RemembermeExtnl=' + (isChecked ? 'f' : 't'), 'RemembermeExtnl=' + (isChecked ? 't' : 'f'))
       $('form').eq(0).attr('action', actionstring);
  });
</script>

在_ExternalLoginListPartial中:

string action = Model.Action;
string returnUrl = Model.ReturnUrl;
string remembermeExtnl = Model.RemembermeExtnl;
using (Html.BeginForm(action, "Account", new { ReturnUrl = returnUrl, RemembermeExtnl = remembermeExtnl }))