MVC 5 ASP.NET Identity 2: Capture user's preference for “remember me” in ExternalLogin

后端 未结 2 1676
广开言路
广开言路 2021-01-20 14:29

I am using the Identity 2.0 Sample.

I get that by setting isPersistent to true in ExternalLoginCallback action method, the browser will automatically log the user in

相关标签:
2条回答
  • 2021-01-20 15:01

    Don't delete any code, just change as follows:

    In AccountViewModels, edit to match:

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

    In Account Controller, edit to match:

    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"); 
        ...
        }
    

    In Login view, edit to match:

    <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>
    

    In Login view, add this:

    <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>
    

    In _ExternalLoginListPartial:

    string action = Model.Action;
    string returnUrl = Model.ReturnUrl;
    string remembermeExtnl = Model.RemembermeExtnl;
    using (Html.BeginForm(action, "Account", new { ReturnUrl = returnUrl, RemembermeExtnl = remembermeExtnl }))
    
    0 讨论(0)
  • Check out the AccountController.ExternalLoginConfirmation action and note the call to await SignInHelper.SignInAsync(user, isPersistent: false, rememberBrowser: false). You can set those values to true, or you can update the ExternalLoginConfirmationViewModel and corresponding ExternalLoginConfirmation view to let the user decide.

    BTW: isPersistent will persist the users session across closing and reopening their browser. The rememberBrowser argument is particular to two factor authentication and it sounds like should be left false for your circumstance.

    Tangentially related Supporting remember me with two factor authentication

    0 讨论(0)
提交回复
热议问题