2014-03-20 1 views
5

У меня проблема с поставщиками OWIN OpenId в приложении ASP.NET MVC5, которое использует идентификатор ASP.NET и основано на шаблоне VS2013 с индивидуальной аутентификацией учетной записи пользователя. OWIN провайдеры OpenID для Google и LinkedIn используются для аутентификации входа.OWIN OpenID provider - GetExternalLoginInfo() возвращает null

Проблема в том, что кажется очень случайным; GetExternalLoginInfo() возвращает null при обратном вызове LoginConfirmation, даже если аутентификация входа прошла успешно.

var authManager = HttpContext.Current.GetOwinContext().Authentication; 
var login = authManager.GetExternalLoginInfo(); 

Поставщики в использовании являются Google (Microsoft.Owin.Security.Google 2.1.0) и LinkedIn (от Owin.Security.Providers 1,3) и оба провайдера вызывает ту же проблему.

Иногда он терпит неудачу один раз, а затем снова работает, но иногда он просто продолжает сбой, пока AppPool не переработана.

В настоящее время два экземпляра приложения размещаются в IIS на той же виртуальной машине Windows Azure. Каждый экземпляр имеет свой собственный AppPool, но идентичные настройки (разные поддомены). Иногда логин перестает работать с одним экземпляром, но по-прежнему работает с другим экземпляром.

Проблема была воспроизведена локально (IIS Express - VS2013).

У всех возникли подобные проблемы с аутентификацией OWIN OpenID?

Startup.Auth.cs выглядит следующим образом:

public void ConfigureAuth(IAppBuilder app) 
{ 
    // Enable the application to use a cookie to store information for the signed in user 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
    }); 
    // Use a cookie to temporarily store information about a user logging in with a third  party login provider 
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

    app.UseGoogleAuthentication(); 

    app.UseLinkedInAuthentication("clientId", "clientSecret"); 
} 

Следующие пакеты NuGet Owin используются:

<package id="Microsoft.AspNet.Identity.Core" version="1.0.0" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.Identity.Owin" version="1.0.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Host.SystemWeb" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.ActiveDirectory" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.Cookies" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.Facebook" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.Google" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.Jwt" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.MicrosoftAccount" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.OAuth" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.Twitter" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" /> 
    <package id="Owin" version="1.0" targetFramework="net45" /> 
    <package id="Owin.Security.Providers" version="1.3" targetFramework="net45" /> 
    <package id="System.IdentityModel.Tokens.Jwt" version="3.0.2" targetFramework="net45" /> 

ответ

14

Проблема возникает, когда ASP.NET_SessionId печенье отсутствует.

Установки фиктивного значения в сессии перед перенаправлением провайдера OpenID учетных данных, кажется, решить эту проблему:

[AllowAnonymous] 
public ActionResult Login(string returnUrl) 
{ 
    Session["dummy"] = "dummy"; // Create ASP.NET_SessionId cookie 

    return View(); 
} 

Более подробную информацию в этом ответе: https://stackoverflow.com/a/21234614/205023

+1

спасибо, что спасли меня целый день: D – phnkha

+0

@Marcus Итак, нам нужно установить любое значение в сеансе? Или это должна быть специальная переменная сеанса, которую нужно установить? i.e Session ["ASP.NET_SessionId"]. Я использую проект веб-форм asp.net, а Login Login - null. Когда я перезапускаю свой пул приложений, он работает некоторое время и снова начинает давать нулевое значение. –

+0

Вы можете поместить любое значение в сеанс, он будет создавать cookie ASP.NET_SessionId. – Marcus

2

Для меня, положив ControllerContext.HttpContext.Session.RemoveAll(); в AccountController и ManageController, решена проблема:

public ActionResult ExternalLogin(string provider, string returnUrl) 
    { 
     ControllerContext.HttpContext.Session.RemoveAll(); 

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

и

public ActionResult LinkLogin(string provider) 
    { 
     ControllerContext.HttpContext.Session.RemoveAll(); 

     // Request a redirect to the external login provider to link a login for the current user 
     return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId()); 
    } 
+0

Это сработало для меня хорошо! – Arry

2

Принятый ответ не решил проблему для меня; что работала над тем, чтобы включить «API Google+» в Менеджере API из Консоли Google Developers Console.

0

Я использую SecuritySwitch для настройки защищенных и не защищенных страницы и причину моей проблемы в том, что /Google-зарегистрировалось путь был перенаправлен на незащищенный запрос, вместо использования защищенного запроса.

0

Правильный подход здесь сводится только для обновления всех компонентов owin в решении.