2014-08-29 3 views
3

Я создал простой веб-сайт ASP.NET MVC4 для тестирования нового промежуточного программного обеспечения OWIN Authentication, я решил начать с Google OAuth2, у меня была битва совсем немного с конфигурации, но мне удалось заставить Google авторизовать пользователя, проблема, которую я имею сейчас, заключается в том, что OWIN не аутентифицирует пользователя.ASP.NET Identity OWIN Middleware Google OAuth2 AuthenticationManager SignIn не работает

Я думаю, что у меня есть соответствующие настройки в веб-конфигурации

<system.web> 
    <authentication mode="None" /> 
</system.web> 
<system.webServer> 
    <modules> 
     <remove name="FormsAuthenticationModule" /> 
    </modules> 
</system.webServer> 

Тогда у меня в классе запуска очень простую конфигурацию

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 
    } 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
     // Enable the External Sign In Cookie. 
     app.SetDefaultSignInAsAuthenticationType(DefaultAuthenticationTypes.ExternalCookie); 
     // Enable Google authentication. 
     app.UseGoogleAuthentication(GetGoogleOptions()); 
    } 

    private static GoogleOAuth2AuthenticationOptions GetGoogleOptions() 
    { 
     var reader = new KeyReader(); 
     var keys = reader.GetKey("google"); 
     var options = new GoogleOAuth2AuthenticationOptions() 
     { 
      ClientId = keys.Public, 
      ClientSecret = keys.Private 
     }; 
     return options; 
    } 
} 

В AccountController я кодированный действия следующих путь, который снова очень прост, но он должен работать.

[AllowAnonymous, HttpPost, ValidateAntiForgeryToken] 
    public ActionResult ExternalLogin(string provider, string returnUrl) 
    { 
     return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); 
    } 

    [AllowAnonymous, HttpGet] 
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
    { 
     var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
     if (loginInfo == null || !loginInfo.ExternalIdentity.IsAuthenticated) 
     { 
      return RedirectToAction("Login"); 
     } 

     var identity = new ClaimsIdentity(new[] { 
      new Claim(ClaimTypes.Name, loginInfo.DefaultUserName), 
      new Claim(ClaimTypes.Email, loginInfo.Email) 
     }, DefaultAuthenticationTypes.ExternalCookie); 

     AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 

     AuthenticationManager.SignIn(new AuthenticationProperties 
       { 
        IsPersistent = false 
       }, identity); 

     return RedirectToLocal(returnUrl); 
    } 

Основная проблема у меня в том, что вызов метода AuthenticationManager.SignIn не кажется, делать что-либо, даже если Google является предоставление доступа к запросу, когда пользователь перенаправляется на главную страницу в котором у меня есть следующий код

@using Microsoft.AspNet.Identity 
@{ 
    Layout = "~/Views/Shared/_Main.cshtml"; 
} 
<h2>Welcome</h2> 
@{ 
    if (Request.IsAuthenticated) 
    { 
     <p>Welcome @User.Identity.GetUserName()</p> 
    } 
    else 
    { 
     @Html.ActionLink("Login", "Login", "Account") 
    } 
} 

значение Request.IsAuthenticated всегда ложно, кто имеет представление о том, что я здесь отсутствует? Из того, что я читал в Интернете, это должно работать.

У меня есть печенье включены в браузере и других образцов Google OAuth, что у меня есть, которые полагаются на работы в классе UserManager, но эта простая реализация у меня не работает

ответ

5

После бесчисленных часов чтения в Интернете ответов я решил отлаживать исходный код Owin, чтобы найти решение этой проблемы, в то время сеанса отладки, я наткнулся на этот драгоценный камень в AuthenticationHandler классе

if (BaseOptions.AuthenticationMode == AuthenticationMode.Active) 
     { 
      AuthenticationTicket ticket = await AuthenticateAsync(); 
      if (ticket != null && ticket.Identity != null) 
      { 
       Helper.AddUserIdentity(ticket.Identity); 
      } 
     } 

в моем оригинальном Startup классе я включение внешнего знака в печенье с этим метод

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

Этот метод использует CookieAuthenticationOptions экземпляра по умолчанию, который имел AuthenticationMode = AuthenticationMode.Passive и это предотвращало класс от чтения информации, хранящейся в куках, что путь на каждом новое запроса OwinContext не нагружает подлинность личности и в результате на Request.IsAuthenticated

После того как я понял, что это все, что я сделал, чтобы изменить app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); с этим

app.UseCookieAuthentication(new CookieAuthenticationOptions() 
      { 
       AuthenticationMode = AuthenticationMode.Passive, 
       AuthenticationType = DefaultAuthenticationTypes.ExternalCookie, 
       ExpireTimeSpan = TimeSpan.FromMinutes(30) 
      }); 

и все работало прекрасно

5

У меня была такая же проблема, но все, что мне нужно было сделать, это добавить «Google + API» в список APIS в консоли разработчика Google. После этого все сработало.

+0

Это было правильное решение для меня. Благодарю. – MoonStom

+0

Спасибо, Митчелл! – Adamy

Смежные вопросы