Как войти в систему пользователя после аутентификации OpenID

#c# #authentication #model-view-controller #asp.net-identity #dotnetopenauth

#c# #аутентификация #модель-представление-контроллер #asp.net-identity #dotnetopenauth

Вопрос:

Вам придется простить меня за то, что я не знаю магии OpenID. В моем потоке; пользователь направляется с внешнего сайта и проходит проверку подлинности с помощью OpenID. Они возвращаются в мое приложение для создания дополнительного имени пользователя и пароля. Они регистрируют свою учетную запись в моем приложении и входят в систему.

Когда они запускают мое приложение со своего сайта после регистрации (внешний сайт), мне нужно, чтобы пользователь автоматически входил в систему, соблюдая учетные данные OpenID.

Я использую следующий код:

     internal class ChallengeResult : HttpUnauthorizedResult
    {
        public ChallengeResult(string provider, string redirectUri)
            : this(provider, redirectUri, null) { }

        public ChallengeResult(string provider, string redirectUri, string userId)
        {
            LoginProvider = provider;
            RedirectUri = redirectUri;
            UserId = userId;
        }

        public string LoginProvider { get; set; }
        public string RedirectUri { get; set; }
        public string UserId { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            var properties = new AuthenticationProperties { RedirectUri = RedirectUri };
            if (UserId != null)
            {
                properties.Dictionary[XSRF_KEY] = UserId;
            }
            context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
        }
  

Затем перенаправляется на эту функцию после этого:

         var openid = new OpenIdRelyingParty();
        var response = openid.GetResponse();
        if (response == null)
        {
            Identifier id;
            if (Identifier.TryParse(_identifer, out id))
            {
                try
                {
                    return openid.CreateRequest(_identifer).RedirectingResponse.AsActionResultMvc5();
                } catch (ProtocolException e)
                {
                    throw new Exception(e.Message);
                }
            }
            return View("Login");
        }
        switch (response.Status)
        {
            case AuthenticationStatus.Authenticated:
                Session["FriendlyIdentifier"] = response.FriendlyIdentifierForDisplay;
                FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);
                // Now I need to log in the user
                break;
            case AuthenticationStatus.Canceled:
               break;
            case AuthenticationStatus.Failed:
               break;
        }
  

После того, как ответ будет возвращен и аутентифицирован с OpenIdRelyingParty, мне нужно войти в систему пользователя. Нужно ли мне включать аутентификацию формы, чтобы это работало? Я использую MVC Identity 2.0.

Ответ №1:

Это часть того, что у меня есть в моем public ActionResult ExternalLoginCallback(string returnUrl) методе, который является методом, вызываемым с внешнего сервера OpenID (в данном случае это Intuit, но это не должно иметь значения).

 //Attempt to log the user in if they've already created an account with the external login.
if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))
{        
    return RedirectToLocal(returnUrl);
}