在我的网络应用程序中,我已将Google注册为单点登录提供商:
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions {
ClientId = "8765.......apps.googleusercontent.com",
ClientSecret = "Secret"
})
我的应用不允许用户注册/注册(而是他们的帐户由管理员创建,但他们稍后可以将他们的帐户与Google相关联)。
在我的"使用Google登录"控制器,我正在尝试发布Challenge()
以重定向到Google。这可能不是正确的方法:
string redirectUri = "http://localhost:55262/SSO/Google/ProcessToken"; // actually created in code, but shown as string for clarity
AuthenticationProperties properties = new AuthenticationProperties();
properties.RedirectUri = Server.UrlEncode(redirectUri);
Context.GetOwinContext().Authentication.Challenge(properties, "Google");
这正确地将用户发送给Google,但Google会出现错误:redirect_uri_mismatch ,并说:
请求中的重定向URI:http://localhost:55262/signin-google 与注册的重定向URI不匹配。
在Google控制台中的返回URI集合未包含指定的redirect_uri
之前,我已经看到此错误。
如果我在VS2015中调试,我可以在redirect_uri
中看到AuthenticationProperties
属性设置正确,但似乎OWIN / Katana没有将其传递给Google。相反,当我点击Google时,return_uri是OWIN / Katana使用的默认值。我设置的那个被忽略了。
Google请求详情似乎证实了这一点:
scope=openid profile email
response_type=code
redirect_uri=http://localhost:55262/signin-google
我在这做错了什么?我是否应该使用Challenge()
来允许用户将自己的本地应用帐户与Google相关联?
答案 0 :(得分:7)
提供有关已接受答案的其他信息......
/signin-google
出现/signin-google
URI由OWIN / Katana内部管理。作为开发人员,您不需要担心,但 需要将其作为授权重定向URI 添加到Google开发人员控制台中。
在Google请求中,请注意OWIN 始终将重定向URI作为/signin-google
传递给Google,无论您在AuthenticationProperties.RedirectUri
媒体资源中设置了哪种自定义URI。虽然起初这可能看起来像是一个错误/问题,但它的一个主要优点是OWIN可以通过一个回调URI来管理所有回调。您的回调URI也不会被遗忘(见下文)!。
嗯,这就是AuthenticationProperties()
发挥作用的地方。通过指定您自己的回调网址...
AuthenticationProperties properties = new AuthenticationProperties { RedirectUri = "https://my.app.com/custom/callback/uri" };
...在OWIN检查了Google令牌并提取了必要的详细信息后,用户将被重定向到您指定的URL。
这是我感到困惑的地方,因为我不明白如何处理/signin-google
,实际上没有采取任何行动。这适用于MVC和网络表单 - 您无需关心传递给Google的内容。但是,如果使用webforms或在web.config中指定授权规则,则需要这样做以防止返回的用户再次访问日志页面:
<location path="signin-google">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
以下是将用户发送给Google所需的所有代码,并返回包含其详细信息的令牌:
将用户从控制器,按钮点击事件,页面加载,任何内容(无论您的ASP /托管堆栈)发送给Google:
// set the callback, for after OWIN finishes examining what comes back from Google
AuthenticationProperties properties = new AuthenticationProperties { RedirectUri = "https://www.myapp.com/some/callback/uri" };
// send the user to Google
Context.GetOwinContext().Authentication.Challenge(properties, "Google");
// Stop execution of the current page/method - the 401 forces OWIN to kick-in and do its thing
Response.StatusCode = 401;
Response.End();
用户在验证身份后从Google返回
Microsoft.AspNet.Identity.Owin.ExternalLoginInfo loginInfo = Context.GetOwinContext().Authentication.GetExternalLoginInfo();
答案 1 :(得分:3)
注意 OWIN的开放式身份验证具有预定义的方法。换句话说,在localhost:port/signin-google
中,OWIN等待外部身份验证服务调用 signin-google (尽管您无法在项目中找到它的实现)。 signin-google 是一个有效且有效的路径,我预先劝告您不要更改它(因为避免将新实现编写为控制器操作)。
我遇到了类似的麻烦,在经历了许多疲惫的日子之后,最后,我发现问题来自原始用户的URL,该URL对OWIN发送的redirect_uri
有效。清楚:
redirect_uri
等于
www.site.com/signin-google
redirect_uri
等于
site.com/signin-google
根据控制台中输入的重定向网址,Google会针对上述案例之一返回redirect_uri_mismatch
错误。我认为你的问题也来自这个现实,解决方案在控制台中设置任何可能的URL。