Корень проблемы
Действие Token не размещается в контроллере, а вместо этого встроено где-то в сантехнику нижнего уровня. Доступ к механизму возможен только через метод переопределения GrantResourceOwnerCredentials()
в классе, расширяющем OAuthAuthorizationServerProvider
. (В нашем случае это ApplicationOAuthProvider.cs
).
GrantResourceOwnerCredentials()
имеет доступный контекст, но он не вызывается как часть запроса PreFlight, поэтому у вас нет возможности вставить соответствующие заголовки ответов PreFlight для CORS.
Решение
В итоге мы остановились на следующем решении. Я не большой поклонник этого, потому что он заставляет эти заголовки в каждом ответе, но, по крайней мере, это работает.
Решение состояло в том, чтобы переопределить метод Application_PreSendRequestHeaders() в Global.asax, чтобы вставить соответствующие заголовки.
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>
Причина цикла поиска допустимых источников заключается в том, что вы не можете ответить списком разрешенных источников...
Это решило большинство проблем за одним исключением (если я правильно помню, были проблемы с глаголами PUT и DELETE). Это потребовало удаления «ExtensionlessUrlHandler-Integrated-4.0» и повторного добавления его с путем и глаголом в разделе обработчиков файла web.config.
web.config (второе изменение)
<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
person
RonnBlack
schedule
21.06.2016