No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
To enable | == Enabling CORS == | ||
To enable CORS on IIS - all sites on the machine: | |||
Add a or change web.config on the root | Add a or change web.config on the root website (Default Web site)<pre><?xml version="1.0" encoding="utf-8"?> | ||
<configuration> | <configuration> | ||
<system.webServer> | <system.webServer> | ||
Line 23: | Line 24: | ||
https://www.test-cors.org/ | https://www.test-cors.org/ | ||
== Contender | == Contender Implementation - Cors with Dynamic Decisions == | ||
To allow dynamic decisions on whom to allow | To allow dynamic decisions on whom to allow Cors entry, you can now implement this model pattern: | ||
[[File:2020-09-16 17h27 21.png|none|thumb|608x608px]] | [[File:2020-09-16 17h27 21.png|none|thumb|608x608px]] | ||
Class named TK_WebCors with a static method GetAllowOrigin(org:String):Boolean | Class named TK_WebCors with a static method GetAllowOrigin(org:String):Boolean | ||
This method will be called when you use RestAllowed | This method will be called when you use RestAllowed Viewmodels and the callers Origin in small caps will be given in the parameter. | ||
This example returns true for all -> | This example returns true for all -> which means that all origins are ok. | ||
A more realistic implementation might be | A more realistic implementation might be: | ||
MyValidCorsCallers.allinstances->select(x|x.Origin=org)->first.Allowed | MyValidCorsCallers.allinstances->select(x|x.Origin=org)->first.Allowed | ||
The check is cached in | The check is cached in an internal Dictionary for 10 minutes - changes will only be discovered in 10-minute intervals. | ||
If the model pattern is wrong you get an exception in turnkey log: | If the model pattern is wrong, you get an exception in the turnkey log: | ||
CentralLogging("CheckCorsHeaders - check model pattern static TK_WebCors.GetAllowOrigin(vOrigin):string", ex) | CentralLogging("CheckCorsHeaders - check model pattern static TK_WebCors.GetAllowOrigin(vOrigin):string", ex) | ||
NOTE - if you have Cors-middleware in IIS or Cassini you will not see the effect from the above since middleware will overwrite. | NOTE - if you have Cors-middleware in IIS or Cassini you will not see the effect from the above since middleware will overwrite. | ||
If cors headers are applied this is what we apply: | If cors headers are applied, this is what we apply: | ||
Response.Headers.Add("Access-Control-Allow-Origin", cleanorg); | Response.Headers.Add("Access-Control-Allow-Origin", cleanorg); | ||
Response.Headers.Add("Access-Control-Allow-Credentials", "true"); | Response.Headers.Add("Access-Control-Allow-Credentials", "true"); | ||
Line 46: | Line 47: | ||
Response.Headers.Add("Access-Control-Allow-Methods", "POST, GET"); | Response.Headers.Add("Access-Control-Allow-Methods", "POST, GET"); | ||
Response.Headers.Add("Vary", "Origin"); | Response.Headers.Add("Vary", "Origin"); | ||
You may also send (not recommended due to open nature of web)the | You may also send (not recommended due to the open nature of the web) the credentials in the basic authentication scheme: | ||
<pre> | <pre> | ||
function myFunction(){ | function myFunction(){ | ||
Line 67: | Line 68: | ||
==== Writing to ViewModels from javascript ==== | ==== Writing to ViewModels from javascript ==== | ||
Post data to a ViewModel driven MDriven Form (ie not the | Post data to a ViewModel driven MDriven Form (ie not the best way - but rather just injecting data into standard UI) you can proceed like this: | ||
<pre> | <pre> | ||
let formData = new FormData(); | let formData = new FormData(); |
Revision as of 14:35, 15 December 2022
Enabling CORS
To enable CORS on IIS - all sites on the machine:
Add a or change web.config on the root website (Default Web site)
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <cors enabled="true" failUnlistedOrigins="true"> <add origin="*"/> <add origin="https://www.test-cors.org" allowCredentials="true" > <allowHeaders allowAllRequestedHeaders="true"/> </add> </cors> </system.webServer> </configuration>
To do this on App level - change Web.config in the same way - but beware that web-config is part of the installation and will be replaced on update.
Good links:
- Details from the IIS team on details on how to configure CORS using XML (like above): https://blogs.iis.net/iisteam/getting-started-with-the-iis-cors-module
To test that CORS is active, you can use this online tool, for example. Just enter the root URL of your site in "Remote URL"
Contender Implementation - Cors with Dynamic Decisions
To allow dynamic decisions on whom to allow Cors entry, you can now implement this model pattern:
Class named TK_WebCors with a static method GetAllowOrigin(org:String):Boolean
This method will be called when you use RestAllowed Viewmodels and the callers Origin in small caps will be given in the parameter.
This example returns true for all -> which means that all origins are ok.
A more realistic implementation might be:
MyValidCorsCallers.allinstances->select(x|x.Origin=org)->first.Allowed
The check is cached in an internal Dictionary for 10 minutes - changes will only be discovered in 10-minute intervals.
If the model pattern is wrong, you get an exception in the turnkey log:
CentralLogging("CheckCorsHeaders - check model pattern static TK_WebCors.GetAllowOrigin(vOrigin):string", ex)
NOTE - if you have Cors-middleware in IIS or Cassini you will not see the effect from the above since middleware will overwrite.
If cors headers are applied, this is what we apply:
Response.Headers.Add("Access-Control-Allow-Origin", cleanorg); Response.Headers.Add("Access-Control-Allow-Credentials", "true"); Response.Headers.Add("Access-Control-Allow-Headers", "authorization"); Response.Headers.Add("Access-Control-Allow-Methods", "POST, GET"); Response.Headers.Add("Vary", "Origin");
You may also send (not recommended due to the open nature of the web) the credentials in the basic authentication scheme:
function myFunction(){ $.ajax({ type: "get", url: "http://localhost:5052/TurnkeyRest/Get?command=AutoFormClass1x&id=1!45", xhrFields: { withCredentials: true }, headers: { "Authorization": "Basic " + btoa("theuser:thepwd") } }).done(function (data) { debugger; $('#value1').text(data); }).fail(function (jqXHR, textStatus, errorThrown) { debugger; $('#value1').text(jqXHR.responseText || textStatus); }); }
Writing to ViewModels from javascript
Post data to a ViewModel driven MDriven Form (ie not the best way - but rather just injecting data into standard UI) you can proceed like this:
let formData = new FormData(); formData.append("Filter", "v"); fetch('https://YOURTURNKEYSITE/TurnkeyRest/Post?command=AutoFormSysUserSeeker', { headers: new Headers(), method: "POST", mode: 'cors', body: formData }).then((response) => { if (response.ok) { return response.json() } else { // } }).then((responseJsonData) => { callback && callback(responseJsonData); }).catch((error) => { console.log("getWatchHistory error " + error); });