我正在使用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
类时,我发现了这段代码:
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。
顺便说一句,在哪里申请此功能的适当位置?
答案 0 :(得分:0)
虽然我认为这个解决方案比我想要的更多,但确实工作。我创建了一个IIS URL重写规则,将&display=popup
附加到任何HTTP 302响应,其位置标题与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重写。