MVC 5 ASP.NET Identity 2: зафиксировать предпочтения пользователя, чтобы запомнить меня в ExternalLogin

Я использую образец Identity 2.0.

Я понимаю, что, установив для isPersistent значение true в методе действия ExternalLoginCallback, браузер автоматически войдет в систему пользователя в следующий раз (в определенных пределах), когда он посетит этот же браузер. Я знаю, что если пользовательское предпочтение «запомнить меня» было перехвачено и передано в метод действия ExternalLogin, его можно было бы поместить в returnUrl и получить к нему доступ в ExternalLoginCallback. Но как сделать так, чтобы они предпочли метод действия ExternalLogin?

В этом случае я не понимаю, как установить флажок на странице LoginView и подключить все, чтобы я мог обработать его в методе действия ExternalLogin. Как я могу это сделать?


person Reid    schedule 24.04.2014    source источник


Ответы (2)


Проверьте действие AccountController.ExternalLoginConfirmation и обратите внимание на вызов await SignInHelper.SignInAsync(user, isPersistent: false, rememberBrowser: false). Вы можете установить для этих значений значение true или обновить представление ExternalLoginConfirmationViewModel и соответствующее представление ExternalLoginConfirmation, чтобы пользователь мог принять решение.

Кстати: isPersistent будет сохранять сеанс пользователя при закрытии и повторном открытии браузера. Аргумент rememberBrowser относится к двухфакторной аутентификации, и, похоже, его следует оставить ложным для ваших обстоятельств.

Касательно связанных Поддержка двухфакторной аутентификации

person Jeremy Cook    schedule 25.04.2014
comment
На самом деле моя проблема заключается в использовании внешнего провайдера входа в систему, такого как Google, Facebook, LinkedIn и т. Д., И в возможности зафиксировать предпочтение «запомнить меня» из начальной формы входа, когда она попадает в метод действия ExternalLogin. Я не использую двухфакторную аутентификацию. Все равно спасибо. - person Reid; 26.04.2014
comment
Извините, я неправильно понял. Я обновил свой ответ, чтобы указать вам правильное направление... - person Jeremy Cook; 26.04.2014
comment
Спасибо за ваше обновление, я не могу получить ответ от этого. Я прорвался и опубликую ответ, как только соберу его, и тогда вы увидите, что я искал. - person Reid; 26.04.2014
comment
Хм, жду вашего ответа. - person Jeremy Cook; 26.04.2014

Не удаляйте код, просто измените его следующим образом:

В AccountViewModels отредактируйте, чтобы соответствовать:

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

В Account Controller измените, чтобы соответствовать:

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 }))
person Reid    schedule 25.04.2014