2014-04-24 29 views
3

我正在使用Identity 2.0示例。MVC 5 ASP.NET身份2:在ExternalLogin中捕获用户对“记住我”的偏好

我得到由ExternalLoginCallback操作方法isPersistent设置为true,浏览器会自动记录用户在他们访问使用同一个浏览器(内限制)的下一次。我知道如果用户的“记住我”首选项被捕获并传递给ExternalLogin操作方法,它可以放入returnUrl并在ExternalLoginCallback中访问。但是,如何获得他们对ExternalLogin操作方法的偏好?

我没有在这种情况下获得如何把上一个LoginView页和电线的事情复选框起来,这样我可以在ExternalLogin操作方法处理它。我怎样才能做到这一点?

回答

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 })) 
4

退房的AccountController.ExternalLoginConfirmation动作,并注意呼叫await SignInHelper.SignInAsync(user, isPersistent: false, rememberBrowser: false)。您可以将这些值设置为true,或者您可以更新ExternalLoginConfirmationViewModel和相应的ExternalLoginConfirmation视图以供用户决定。

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

切向相关Supporting remember me with two factor authentication

+0

其实我的问题是使用外部登录提供商,如谷歌,Facebook,LinkedIn等,当它击中ExternalLogin操作方法时,能够从初始登录表单捕获记住我的偏好。我没有使用双因素认证。不管怎样,谢谢你。 – Reid

+0

对不起,我误解了。我已经更新了我的答案,指出你朝着正确的方向发展...... –

+0

与你的更新相比,我无法从中得到答案。我已经突破了,并会在我组装它后立即发布答案,然后您将看到我在找什么。 – Reid