我决定尝试新的Google Oauth2中间件,它几乎打破了一切。这是来自startup.auth.cs的我的提供程序配置。启用后,所有提供商(包括Google提供商)都会在Challenge上获得500内部服务器。但是,内部服务器错误的详细信息不可用,我无法弄清楚如何打开Katana中间件的任何调试或跟踪。在我看来,他们急于将谷歌Oauth中间件推出门外。
//// GOOGLE
var googleOptions = new GoogleOAuth2AuthenticationOptions
{
ClientId = "228",
ClientSecret = "k",
CallbackPath = new PathString("/users/epsignin")
SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
Provider = new GoogleOAuth2AuthenticationProvider
{
OnAuthenticated = context =>
{
foreach (var x in context.User)
{
string claimType = string.Format("urn:google:{0}", x.Key);
string claimValue = x.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new Claim(claimType, claimValue, XmlSchemaString, "Google"));
}
return Task.FromResult(0);
}
}
};
app.UseGoogleAuthentication(googleOptions);
ActionMethod代码:
[AllowAnonymous]
public ActionResult ExternalProviderSignIn(string provider, string returnUrl)
{
var ctx = Request.GetOwinContext();
ctx.Authentication.Challenge(
new AuthenticationProperties
{
RedirectUri = Url.Action("EPSignIn", new { provider })
},
provider);
return new HttpUnauthorizedResult();
}
答案 0 :(得分:26)
这花了我几个小时才弄明白,但问题是@CrazyCoder提到的CallbackPath
。我意识到CallbackPath
必须中的public void ConfigureAuth(IAppBuilder app)
与ChallengeResult
中设置的时间不同。如果它们相同,则在OWIN中抛出500错误。
我的代码是ConfigureAuth(IAppBuilder app)
var googleOptions = new Microsoft.Owin.Security.Google.GoogleOAuth2AuthenticationOptions
{
ClientId = "xxx",
ClientSecret = "yyy",
CallbackPath = new PathString("/callbacks/google"), //this is never called by MVC, but needs to be registered at your oAuth provider
Provider = new GoogleOAuth2AuthenticationProvider
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new Claim("picture", context.User.GetValue("picture").ToString()));
context.Identity.AddClaim(new Claim("profile", context.User.GetValue("profile").ToString()));
return Task.FromResult(0);
}
}
};
googleOptions.Scope.Add("email");
app.UseGoogleAuthentication(googleOptions);
我的回调'控制器代码是:
// GET: /callbacks/googlereturn - callback Action
[AllowAnonymous]
public async Task<ActionResult> googlereturn()
{
return View();
}
//POST: /Account/GooglePlus
public ActionResult GooglePlus()
{
return new ChallengeResult("Google", Request.Url.GetLeftPart(UriPartial.Authority) + "/callbacks/googlereturn", null);
//Needs to be a path to an Action that will handle the oAuth Provider callback
}
private 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[XsrfKey] = UserId;
}
context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
}
}
现在一切正常,虽然很想知道发动机罩下的确切情况&#39;
除非您有其他要求,否则我的建议是让OWIN使用默认的重定向路径,并确保您不会自己使用它们。
答案 1 :(得分:7)
无需在CallbackPath
中指定UseGoogleAuthentication
:
CallbackPath = new PathString("/Account/ExternalLoginCallback")
将授权重定向URIs
的Google设置保持为:
HTTP(S):// yoururl:将ORPort /的登入-谷歌强>
Owin在内部处理signin-google并重定向到redirectUri,如您在ChallengeResult类的代码中所述。哪个是Account / ExternalLoginCallback。
答案 2 :(得分:3)
通过一个简单的更改从教程中获得了它的工作 - 只需将此任何nubes发布到此方法。我认为在这个例子中与oauth2相关的问题在最新的模板/ apis中大量充实 - 我的意思是,如果你从头开始,你可能会很幸运 - 请继续阅读:
一个改变: 它工作,但只有在最新版本的谷歌开发者网站启用谷歌+ apis后。
(只需访问google api lib管理员,登录并搜索api目录中的google + api)。
注意:对我来说,默认情况下已禁用Google+ API。
我没有做任何其他独特的事。
干杯
答案 3 :(得分:1)
到目前为止给出的答案让我走上了一条非常黑暗的道路,我希望自己没有走过......解决方案很简单,确保以下3件事情匹配:
1)在Google OATH凭据(https://console.developers.google.com/)中:
2)在AccountController
:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
return new ChallengeResult(provider,
Url.Action("ExternalLoginCallback", "Account",
new { ReturnUrl = returnUrl }));
}
注意Action是&#34; ExternalLoginCallback&#34;
3)在App_Start\Startup.Auth.cs
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
ClientId = "yourclientid.apps.googleusercontent.com",
ClientSecret = "yoursecret",
Provider = new GoogleOAuth2AuthenticationProvider(),
CallbackPath = new PathString("/Account/ExternalLoginCallback")
});
请注意,CallbackPath
再次与其他2
PathString
最后,如果您仍然无法获取,请在您的应用Web.config
<authentication mode="None" />
获取有关该问题的更多详细信息。
答案 4 :(得分:0)
为了简单起见,我使用带有身份验证的默认ASP.NET MVC 5模板,但希望可以针对不同的用例修改它。
<强> StartupAuth.cs 强>
不要自定义重定向路径。无论如何它被/ signin-google取代,我试图绕过它会导致“无声”(不在调试器中)内部服务器500错误。
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
ClientId = "whatevs.apps.googleusercontent.com",
ClientSecret = "whatevs_secrut",
Provider = new GoogleOAuth2AuthenticationProvider()
});
请务必在APIs & auth
&gt;中将http://whatever.com/signin-google添加到https://console.developers.google.com/。 Credentials
&gt; Redirect URIs
部分。
<强> RouteConfig.cs 强>
将路由添加到路由的永久重定向控制器操作。永久重定向是唯一足够的。仅直接指向回调URL是不够的。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Google API Sign-in",
url: "signin-google",
defaults: new { controller = "Account", action = "ExternalLoginCallbackRedirect" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
<强> AccountController.cs 强>
永久重定向到内置回调方法,你应该没问题。
[AllowAnonymous]
public ActionResult ExternalLoginCallbackRedirect(string returnUrl)
{
return RedirectPermanent("/Account/ExternalLoginCallback");
}
模板项目已发布在GitHub上以供参考:https://github.com/Pritchard/Test-AspNetGoogleOAuth2Authentication