AuthenticationProperties.RedirectUri未在Challenge()

时间:2015-11-13 17:13:42

标签: asp.net asp.net-mvc owin katana google-signin

在我的网络应用程序中,我已将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相关联?

2 个答案:

答案 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有效。清楚:

  • 如果您输入www.site.com→redirect_uri等于 www.site.com/signin-google
  • 如果您输入site.com→redirect_uri等于 site.com/signin-google

根据控制台中输入的重定向网址,Google会针对上述案例之一返回redirect_uri_mismatch 错误。我认为你的问题也来自这个现实,解决方案在控制台中设置任何可能的URL。