gpt4 book ai didi

asp.net - AuthenticationProperties.RedirectUri 未在 Challenge() 中传递给 Google

转载 作者:行者123 更新时间:2023-12-02 10:18:07 28 4
gpt4 key购买 nike

在我的网络应用程序中,我已将 Google 注册为单点登录提供商:

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions {
ClientId = "8765.......apps.googleusercontent.com",
ClientSecret = "Secret"
})

我的应用不允许用户注册(他们的帐户是由管理员创建的,但他们可以稍后将其帐户与 Google 关联)。

在我的“使用 Google 登录” Controller 中,我尝试发出 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,并表示:

The redirect URI in the request: http://localhost:55262/signin-google did not match a registered redirect 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 关联吗?

最佳答案

提供有关已接受答案的更多信息...

可以忽略 /signin-google

看来 /signin-google URI 由 OWIN/Katana 内部管理。作为开发者,您不需要关心它,但您确实需要将其作为授权重定向URI添加到Google开发者控制台中。

在 Google 请求中,请注意,OWIN始终将重定向 URI 作为 /signin-google 传递给 Google,无论您在 中设置什么自定义 URI AuthenticationProperties.RedirectUri 属性。尽管乍一看这似乎是一个错误/问题,但它有一个主要优点,因为 OWIN 可以通过单个回调 URI 管理所有回调。您的回调 URI 也不会被忘记(见下文)!

那么您自己的重定向 URL 又如何呢?

嗯,这就是 AuthenticationProperties() 发挥作用的地方。通过像这样指定您自己的回调 URL...

AuthenticationProperties properties = new AuthenticationProperties { RedirectUri = "https://my.app.com/custom/callback/uri" };

...OWIN 检查 Google token 并提取必要的详细信息后,用户将被重定向到您指定的 URL。

这就是我感到困惑的地方,因为我不明白如何处理 /signin-google,而实际上没有采取任何行动。这适用于 MVC 和 Web 表单 - 您无需关心传递给 Google 的内容。但是,如果使用 Webforms,或者在 web.config 中指定授权规则,您将需要它来防止回访用户再次点击日志页面:

<location path="signin-google">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>

以下是将用户发送给 Google 并返回包含其详细信息的 token 所需的全部代码:

出站

从 Controller 、按钮点击事件、页面加载、任何内容(无论您的 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();

关于asp.net - AuthenticationProperties.RedirectUri 未在 Challenge() 中传递给 Google,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33698266/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com