問題の根本
Token アクションはコントローラでホストされていませんが、代わりに下位レベルの配管のどこかに組み込まれています。このメカニズムへの唯一のアクセスは、継承GrantResourceOwnerCredentials()
するクラスのオーバーライド メソッドを使用することOAuthAuthorizationServerProvider
です。(私たちの場合はですApplicationOAuthProvider.cs
)。
GrantResourceOwnerCredentials()
利用可能なコンテキストがありますが、PreFlight リクエストの一部として呼び出されないため、CORS に適切な PreFlight レスポンス ヘッダーを挿入する方法がありません。
ソリューション
最終的に、次の解決策に落ち着きました。これらのヘッダーをすべての応答に強制するため、私はそれの大ファンではありませんが、少なくとも機能します。
解決策は、Global.asax の Application_PreSendRequestHeaders() メソッドをオーバーライドして、適切なヘッダーを挿入することでした。
Global.asax.cs
void Application_PreSendRequestHeaders(Object sender, EventArgs e)
{
var origin = Request.Headers.Get("Origin");
var validOrigins = ConfigurationManager.AppSettings["allowedCorsOrigins"].Split(',');
if(validOrigins.Any(o => o == origin))
{
Response.Headers.Set("Access-Control-Allow-Origin", origin);
Response.Headers.Set("Access-Control-Allow-Credentials", "true");
Response.Headers.Set("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization, withcredentials, Prefer");
Response.Headers.Set("Access-Control-Expose-Headers", "Claims, *");
Response.Headers.Set("Access-Control-Max-Age", "600");
Response.Headers.Set("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
}
}
これには、次の web.config エントリが必要です。
web.config
<configuration>
<appSettings>
<add key="allowedCorsOrigins" value="http://www.allowedsite1.net,http://localhost:22687" />
<add key="allowedCorsMethods" value="get, post, put, delete, options, batch" />
<add key="allowedCorsHeaders" value="*" />
</appSettings>
...
</configuration>
有効なオリジンを検索するループの理由は、許可されたオリジンのリストで応答できないためです...
これにより、1 つの例外を除いてほとんどの問題が解決されました (私の記憶が正しければ、PUT 動詞と DELETE 動詞の問題でした)。これには、「ExtensionlessUrlHandler-Integrated-4.0」を削除し、web.config のハンドラー セクションにパスと動詞を付けて再度追加する必要がありました。
web.config (2 回目の変更)
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="" />
</handlers>
....
</system.webServer>
CORS 関連の便利なリンク