为 Microsoft.Owin.Security.Facebook 的挑战 URL 指定 "display" 查询字符串字段
Specifying the "display" query string field for Microsoft.Owin.Security.Facebook's challenge URL
我正在使用 Microsoft.Owin.Security.Facebook 3.0.1 NuGet 包将 Facebook 身份验证添加到我的 Web API 2.2 应用程序中。我有这样的代码,当用户尝试登录时,Microsoft 的中间件将他们重定向到 Facebook 的 OAuth 对话框,其中包含 URL,如下所示:
https://www.facebook.com/dialog/oauth?response_type=code&client_id=<omitted>&redirect_uri=<omitted>&scope=&state=<omitted>
我希望生成的 HTTP 302 呈现 Facebook 的特定于弹出版本的身份验证对话框。 Facebook 的 documentation 说我可以将 display
查询字符串字段的值设置为 popup
。不幸的是,微软的 Facebook 中间件中似乎没有 display
的设置。事实上,在反编译内部 Microsoft.Owin.Security.Facebook.FacebookAuthenticationHandler
class 后,我发现了这段代码:
string redirectUri = this.get_Options().AuthorizationEndpoint + "?response_type=code&client_id=" + Uri.EscapeDataString(this.get_Options().AppId) + "&redirect_uri=" + Uri.EscapeDataString(stringToEscape1) + "&scope=" + Uri.EscapeDataString(stringToEscape2) + "&state=" + Uri.EscapeDataString(stringToEscape3);
似乎无法自定义由身份验证处理程序生成的 URL。
我的问题是,有没有人运行以前遇到过这个问题并解决了它?我可以在管道的其他地方做些什么来以某种方式将 display
添加到 URL 上吗?我需要使用 Facebook 的 OAuth 对话框的弹出版本。
我尝试了委托处理程序,我看到它拦截了管道中生成的 HTTP 401,但它没有拦截 HTTP 302。
顺便说一句,请求此功能的合适位置在哪里?
尽管我认为此解决方案比我想要的更像是一种 hack,但它确实 有效。我创建了一个 IIS URL 重写规则,将 &display=popup
附加到位置 headers 与 Facebook 的 OAuth 对话框 URL:
匹配的任何 HTTP 302 响应
<rewrite>
<outboundRules>
<rule name="Append display query string field onto Facebook OAuth dialog redirects" preCondition="HTTP 302">
<match serverVariable="RESPONSE_Location" pattern="^https://www\.facebook\.com/dialog/oauth\?.*" />
<action type="Rewrite" value="{R:0}&display=popup" />
</rule>
<preConditions>
<preCondition name="HTTP 302">
<add input="{RESPONSE_STATUS}" pattern="302" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
我不会将此标记为已接受的答案,希望有更好的解决方案不依赖 URL 重写。
我正在使用 Microsoft.Owin.Security.Facebook 3.0.1 NuGet 包将 Facebook 身份验证添加到我的 Web API 2.2 应用程序中。我有这样的代码,当用户尝试登录时,Microsoft 的中间件将他们重定向到 Facebook 的 OAuth 对话框,其中包含 URL,如下所示:
https://www.facebook.com/dialog/oauth?response_type=code&client_id=<omitted>&redirect_uri=<omitted>&scope=&state=<omitted>
我希望生成的 HTTP 302 呈现 Facebook 的特定于弹出版本的身份验证对话框。 Facebook 的 documentation 说我可以将 display
查询字符串字段的值设置为 popup
。不幸的是,微软的 Facebook 中间件中似乎没有 display
的设置。事实上,在反编译内部 Microsoft.Owin.Security.Facebook.FacebookAuthenticationHandler
class 后,我发现了这段代码:
string redirectUri = this.get_Options().AuthorizationEndpoint + "?response_type=code&client_id=" + Uri.EscapeDataString(this.get_Options().AppId) + "&redirect_uri=" + Uri.EscapeDataString(stringToEscape1) + "&scope=" + Uri.EscapeDataString(stringToEscape2) + "&state=" + Uri.EscapeDataString(stringToEscape3);
似乎无法自定义由身份验证处理程序生成的 URL。
我的问题是,有没有人运行以前遇到过这个问题并解决了它?我可以在管道的其他地方做些什么来以某种方式将 display
添加到 URL 上吗?我需要使用 Facebook 的 OAuth 对话框的弹出版本。
我尝试了委托处理程序,我看到它拦截了管道中生成的 HTTP 401,但它没有拦截 HTTP 302。
顺便说一句,请求此功能的合适位置在哪里?
尽管我认为此解决方案比我想要的更像是一种 hack,但它确实 有效。我创建了一个 IIS URL 重写规则,将 &display=popup
附加到位置 headers 与 Facebook 的 OAuth 对话框 URL:
<rewrite>
<outboundRules>
<rule name="Append display query string field onto Facebook OAuth dialog redirects" preCondition="HTTP 302">
<match serverVariable="RESPONSE_Location" pattern="^https://www\.facebook\.com/dialog/oauth\?.*" />
<action type="Rewrite" value="{R:0}&display=popup" />
</rule>
<preConditions>
<preCondition name="HTTP 302">
<add input="{RESPONSE_STATUS}" pattern="302" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
我不会将此标记为已接受的答案,希望有更好的解决方案不依赖 URL 重写。