Я создал простой веб-сайт 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
, но эта простая реализация у меня не работает
Это было правильное решение для меня. Благодарю. – MoonStom
Спасибо, Митчелл! – Adamy