Service configuration (reference)
Every configuration key of the service under Gateway, with its default and effect. The values come from
appsettings.json, appsettings.<environment>.json, environment variables, command-line arguments, and
appsettings.Local.json; for the same key the later source wins, so appsettings.Local.json takes
precedence over all others; with an administration store, the operating data (data sources, rules, assignments) is kept
there instead of in the file. A configuration that fails the startup check prevents the service from
starting; the log names each error.
Syntax
{
"Gateway": {
"Databases": [ { "Name": "fachdaten", "Provider": "sqlserver", "ConnectionString": "…" } ],
"MetadataCacheSeconds": 300,
"ResponseCompression": true,
"Security": { "AuthMode": "ApiKey, Windows", "ApiKeys": [], "Clients": [] },
"Limits": { "DefaultTop": 1000, "MaxTop": 10000 },
"Store": { "Path": "store/gateway.db", "MasterKey": "env:WKL_GW_MASTER_KEY" },
"Certificate": { "Subject": "daten.example.com" },
"Downloads": { "Path": "downloads" }
},
"Kestrel": { "Endpoints": { } }
}
As an environment variable with double underscores: Gateway__Databases__0__ConnectionString.
Parameters
Content root
The appsettings*.json files and every relative path on this page refer to the service's content
root: as a Windows service, the program folder; otherwise the working directory at startup (under
systemd, WorkingDirectory). The startup argument --contentRoot <folder> sets it explicitly.
Secrets and references
appsettings.json describes the shape and the defaults and contains no connection string and no
key. Both belong to the instance being operated:
appsettings.Local.jsonin the content root—the service reads it in every environment; in development it's ignored by git, in operation it holds, for example, the change of the master key;- environment variables (
Gateway__Databases__0__ConnectionString) when running as a service.
Keys are configured exclusively as a reference:
| Reference | Meaning |
|---|---|
env:NAME | process environment variable. The recommended form |
file:PATH | content of the file, without leading and trailing whitespace. For a secret in a file that only the service account may read |
plain:wert | literal. For development only |
vault:name | reserved; it's not resolved and therefore counts as a reference that can't be resolved |
A reference that can't be resolved prevents startup. That's intentional: an unset environment variable would otherwise show up as a caller that inexplicably can't sign in.
Gateway
| Key | Default | Meaning |
|---|---|---|
TransactionIdleSeconds | 120 | How long a transaction opened by a client may stay unused before the service rolls it back. Every request in it restarts the period |
MaxTransactionsPerCaller | 4 | How many transactions a caller may keep open at the same time; any further one is rejected with 429 |
MetadataCacheSeconds | 300 | How long the resource catalog of a database is valid. A new object becomes reachable within this time, not immediately; after it expires, the next request is answered with the previous state and the catalog is refreshed in the background |
ResponseCompression | true | Compress responses with Brotli or gzip if the caller sends Accept-Encoding; see below |
Compressed responses (Gateway:ResponseCompression, default true): if the caller sends
Accept-Encoding, the service compresses every response with Brotli or gzip at the fastest level—also
over HTTPS. JSON repeats the column names in every row and therefore compresses well; over a slow line,
this noticeably shortens the time it takes to load large tables. The driver and Power Query decompress
automatically. Regarding the BREACH attack,
which exploits compressed HTTPS responses
(RFC 7457, section 2.6): it needs a secret in the
same response as a text chosen by the attacker, and a browser that signs in automatically. Data responses
carry only the requested data; however, the responses to the exchange and setup of the second factor and
to issuing a key do carry a secret and are also compressed. If you serve a browser application with
Windows sign-in from the same origin and want to rule out the question, turn the switch off.
Gateway:Databases
One alias per entry. With an administration store, the data sources are kept there (set DataSources).
| Key | Default | Meaning |
|---|---|---|
Name | — | alias under which callers address the database; the only part that leaves the process |
Enabled | true | When disabled, the alias responds like an unknown one; rules remain in place |
Provider | — | ID of the provider that connects the database; sqlserver is included. Empty: Dialect applies. A provider that isn't installed or is rejected by the check prevents startup; the service never falls back to another one |
ProviderVersion | — | fixed version of the provider package; empty: the highest valid installed version |
ProviderOptions | empty | settings that the provider defines and documents, as name/value; the provider's check rejects an unknown name. The included SQL Server provider needs none. Provider, ProviderVersion, and ProviderOptions also exist for data sources in the administration store (set DataSources); which providers are installed and which properties they describe is shown by the sets Providers and ProviderProperties (connection properties of a provider) |
Dialect | mssql | older setting, applies only without Provider: mssql is an alternative name of the sqlserver provider; an unknown value prevents startup |
ConnectionString | — | connection string; never into a repository |
AllowPassThrough | false | custom statements on this alias, see Enable custom statements |
AllowCheckedStatements | true | checked statements for callers without the sql right: joins, functions and set-based changes over objects that their rules allow, see Checked statements; false refuses them |
AllowSqlLogins | false | SQL Server logins via HTTP Basic on this alias, see Set up sign-in with a SQL Server login |
RowStampTables | empty | tables with a computed row stamp (schema.tabelle, schema.*, *), see Make tables without a row version editable |
KeylessWriteTables | empty | tables without a key that may be written via their old values, see Make tables without a key editable |
Persons | Service | Service or Impersonate: whether a person—signed in with a Windows account or a personal key—runs in SQL Server under their own login; effect per method under Sign-in and identity pass-through, setup under Pass people's identities through to SQL Server. Impersonate requires Windows in AuthMode, otherwise the service refuses to start. |
DenyImpersonate | empty | deny list, per entry Logins, Roles, From, ExceptFrom; also applies to database identities, see Identity |
Naming rule for the alias
The alias (Name) becomes part of every address (/odata/v4/<alias>/…, /api/v1/cf/<alias>/…) and is
compared against the callers' rules. That's why the same rule applies to it as to a regular SQL Server
identifier, without a schema part:
| Characteristic | Rule |
|---|---|
| Length | 1 to 128 characters (UTF-16 code units; a character outside the Basic Multilingual Plane, such as an emoji, counts twice and isn't allowed anyway) |
| First character | a letter (any script, including ä, ß) or _ |
| Further characters | letters, digits, _, @, #, $ |
| Not allowed | space, period, hyphen, slash and every other character; a digit, @, # or $ at the start |
| Case | not significant: Fachdaten and fachdaten are the same alias, in the address, in the callers' rules and when checking for duplicates. Two entries that differ only in case prevent startup |
| Reserved names | none. * in the callers' rules means every alias; as a name, * isn't allowed by the character rule anyway |
A violation prevents startup with the message “'<Name>' ist kein zulaessiger Aliasname” ('<Name>' isn't
a valid alias name). Via the administration API (set DataSources), the entry isn't accepted: response
422 with the same message; the store stays unchanged.
Source of the rule in code: GatewayIdentifier.IsValidPart in the contract package
Wkl.Data.Gateway.Contracts; an application that references the package can call exactly this method
before saving.
Gateway:Security
| Key | Default | Meaning |
|---|---|---|
AuthMode | ApiKey | sign-in methods, comma-separated: ApiKey, Windows, SqlLogin, PersonalKey; None only in the Development environment. ApiKey requires at least one entry under ApiKeys, PersonalKey an administration store; without a store, Windows and SqlLogin require at least one mapping. Otherwise the service doesn't start |
ApiKeyHeader | X-Api-Key | header for service keys and personal keys—a header, because a query string ends up in access logs, browser histories and referrers |
CorrelationHeader | X-Request-Id | header with the correlation ID that ties log and error response together |
ApiKeys | empty | service keys: Client (caller) and Key (reference). Entries without ApiKey in AuthMode prevent startup |
Clients | empty | rules: Id, Databases, Resources (tables, views, functions, procedures, sql, admin; * without sql and admin), Objects and ExceptObjects (*, schema.*, schema.name; empty = all objects of the types; not alongside sql), Verbs, ReadOnly; see Rights |
WindowsAccounts | empty | Account (name or SID) and Client; see Windows sign-in |
SqlLogins | empty | Login (name or *) and Client |
RateLimit:PerCaller | 300 | requests per caller and period; 0 turns the limit off. Next pages that the service issued don't count |
RateLimit:WindowSeconds | 60 | length of the period in seconds |
TrustedProxies | empty | addresses of upstream proxies whose X-Forwarded-For, X-Forwarded-Proto, and X-Forwarded-Host the service trusts; see Behind IIS or a proxy |
SignInRules | empty | sign-in policy. Without an administration store it applies as written here and knows only Deny. With an administration store it's only the starting value when the store is created (RequireTotp too); after that, only the rules in the store apply. Rules name networks, people, Windows groups, countries (Countries, ExceptCountries) and exceptions with an end (Exceptions); Mode = Report tries a rule instead of enforcing it. See Sign-in |
TotpSessionHours | 10 | lifetime of a second-factor session in hours, 1 to 168; the setting totp_session_hours in the store takes precedence |
TotpEnrolHours | 24 | period during which a person may set up the second factor themselves at their first sign-in, 0 to 168; 0 turns this off; totp_enrol_hours in the store takes precedence |
Gateway:Limits
| Key | Default | Meaning |
|---|---|---|
DefaultTop | 1000 | window size if the caller doesn't specify one |
MaxTop | 10000 | largest window; a larger value is capped to this value. Groups after $apply come in windows of this size if no size is given |
MaxRows | 100000 | largest number of rows in a response, regardless of where from. On the native route and for custom statements, a truncated response carries truncated. A window (DefaultTop, MaxTop, $top) is never larger than MaxRows, also per object: a page is therefore never truncated at this limit, and via OData reading continues with @odata.nextLink. |
MaxBodyBytes | 1048576 | largest request body; above it 429 |
QueryTimeoutSeconds | 30 | time limit of a statement; above it 504 (TIMEOUT) |
Objects | empty | different limits per object: Match (wildcard pattern against <alias>/<kind>/<object>, such as fachdaten/views/container_*, for custom statements <alias>/sql/) and any of DefaultTop, MaxTop, MaxRows, QueryTimeoutSeconds (not MaxBodyBytes) |
Resource limits via Gateway:Limits, refinable per object. A rule is checked against
<alias>/<kind>/<object>; the first match wins, in the configured order.
Gateway:Providers
| Key | Default | Meaning |
|---|---|---|
Path | empty | folder for providers that the operator installs themselves, absolute or relative to the content root; empty: only the included ones |
At startup, the service searches two folders, each with the layout <folder>/<id>/<version>/ and a
provider.json file in it: the providers folder next to the program (included providers; an upgrade
replaces it) and under Path (belongs to the operator and stays in place during an upgrade). A package is
loaded only if the folder name and ID match, the version of the provider contract fits, the platform fits,
and every file matches its checksum (SHA-256). An operator package may use neither the ID nor an
alternative name of an included provider.
A provider runs inside the service with the service's rights. Only accounts that may also change the service itself may write to either folder; no package can be placed over the network.
Gateway:Store
{
"Gateway": {
"Store": {
"Path": "store/gateway.db",
"MasterKey": "env:WKL_GW_MASTER_KEY",
"PollSeconds": 5
}
}
}
| Setting | Meaning |
|---|---|
Path | path of the file; relative to the content root. Empty: no store, everything from the configuration file |
LogPath | path of the log file holding the sign-in log, the load log, and the access log; relative to the content root. Empty (default): next to the store with -logs appended, so store/gateway-logs.db for store/gateway.db |
LogMaxMegabytes | size within which the log file is kept, in MB (64–65,536), default 4,096. Beyond it, the service removes the oldest entries |
MasterKey | reference (env: or file:) to the master key, at least 32 bytes. Required with Path |
MaxKeyLifetimeDays | maximum lifetime of a personal key in days, default 365; 0 allows keys without expiry |
MaxActivationHours | maximum duration of an activation of an on-demand key in hours (1–168), default 12; the setting max_activation_hours in the store takes precedence |
SelfServiceKeyDays | lifetime in days of a key issued through self-service (0–3650), default 0 = self-service off; the setting self_service_key_days in the store takes precedence |
MasterKeyId | ID of the master key, default 1; 1 to 64 characters of letters, digits, ., -, _, case-sensitive. Stored in plaintext in every sealed value |
RetiredKeys | retired master keys during a key change, per entry Id and Key (reference); they only open, nothing is sealed with them |
PollSeconds | interval in seconds for checking for changes, default 5; 0 turns it off |
RequireAdminTotp | fixed lower bound, default true: the administration always requires a second factor, even if the rule in the store was deleted; can only be turned off here, see First administrator and recovery |
ChangeLog | keep the change log, default true: who changed which administration entry when, with the values before and after (the ChangeLog set). When turned off, changes are made as before, but no entry is written; existing entries stay. Takes effect at the next reload, without a restart |
PickupMinutes | validity of a one-time link in minutes, default 15 (1 to 1440) |
MailLinkHours | validity of a one-time link by email in hours, default 72 (1 to 720); the setting mail_link_hours in the store takes precedence |
TotpIssuer | name under which an authenticator app lists the second factor, default Wkl.Data.Gateway; choose it so that each installation can be told apart. The installation package sets it from the installation name (GW_INSTALLATION_NAME). 1 to 64 characters, without leading or trailing spaces, colons (separator in the address for the app), quotation marks and control characters; the setting installation_name in the store takes precedence. A new name applies only to factors set up afterward |
SetupKey and EmergencyAccess no longer exist. The setup key was valid over HTTPS from any computer
and became valid again on its own as soon as no administrator could sign in anymore—then without a
second factor. The first administrator is now created by the init-admin command on the server. A
configuration that still contains these values continues to start; the service reports at startup that
it ignores them.
Gateway:SignInLog
The sign-in log in the log file next to the administration store, the sign-in rules, and the reporting of their findings; without a store, the service records nothing.
"Gateway": {
"SignInLog": {
"TimeZone": "Europe/Berlin",
"Networks": [ { "Name": "Plant 3", "Network": "10.3.0.0/16" } ],
"GeoIp": { "StaleDays": 60 },
"Alerts": { "Recipients": [ "security@example.com" ], "DigestHour": 7 }
}
}
| Setting | Default | Meaning |
|---|---|---|
Enabled | true | record sign-ins |
SuccessWindowMinutes | 15 | a successful sign-in appears once per this many minutes, person, method, and origin (1–1440) |
EventDays | 90 | how many days SignInOrigins and SignInEvents read back without a time condition of their own (1–3650). Deletes nothing: individual events stay until the log file reaches its size (Gateway:Store:LogMaxMegabytes) |
HourDays | 400 | retention of hourly counts in days (1–3650) |
TimeZone | the server's time zone | ID of a time zone (Windows or IANA name) for Weekday and HourOfDay, for the days and hours of the findings and profiles, for the time windows of the sign-in policy, and for the time of day in reports; values are stored in UTC |
Alerts:Recipients | empty | email addresses the service reports findings to. Empty: no email; findings only in the service log and in SignInFindings. Requires mail delivery |
Alerts:Digest | true | report findings at level ask once a day as a digest; false turns that off |
Alerts:DigestHour | 7 | from which hour (0–23, TimeZone) the daily digest is sent |
Networks | empty | your own networks with Name (1–64 characters) and Network (address or network in CIDR notation); the first match names the origin. A request from one of your own networks has no country and no network operator for rules by country. In From and ExceptFrom of a sign-in rule, a name stands for every network listed under it |
GeoIp:Folder | geoip folder next to the store file | folder of the geolocation database, relative to the content root |
GeoIp:MaxMegabytes | 256 | largest geolocation database file in MB, on upload and unpacked (1–2048) |
GeoIp:StaleDays | 60 | from this age in days, a file counts as outdated (GeoIpFiles.Stale) (1–365) |
The source of the geolocation database isn't set here but in the store (set-geoip-source), because
a license key can belong to it and the administration is meant to change it.
Reporting findings. Every finding appears in the service log—act as a warning, ask as
information—with rule, time, and person. With Alerts:Recipients, the service also sends each
finding at level act by email right away and the findings at level ask once a day as a digest. An
email names the rule, time, person, and number of the finding, never the address, country, or key;
those appear only in the administration API, for those entitled to see them. A digest that nobody
accepted is sent again the next day.
Gateway:Mail
Mail delivery for reporting findings. Without an entry, the service sends no email.
"Gateway": {
"Mail": {
"Transport": "smtp",
"Host": "mail.example.com",
"Port": 587,
"Encryption": "starttls",
"Username": "gateway@example.com",
"FromAddress": "gateway@example.com",
"FromName": "Data gateway",
"PublicBaseUrl": "https://gateway.example.com"
}
}
| Setting | Default | Meaning |
|---|---|---|
Transport | none | none (no delivery), smtp, or file (each email as a file in MailboxDirectory, for testing) |
Host, Port | –, 587 | mail server for smtp |
Encryption | starttls | starttls, tls, or none |
VerifyPeer | true | check the mail server's certificate |
Username | empty | sign-in name at the mail server |
Password | – | password at the mail server. Don't put it in the file; set it as the service's environment variable Gateway__Mail__Password |
TimeoutSeconds | 10 | how long to wait for the mail server |
FromAddress, FromName | empty | sender; FromAddress is required |
PublicBaseUrl | empty | public address of the service (https://…); required for any delivery |
MailboxDirectory | empty | folder for file, relative to the content root |
Strict | true | refuses unsafe settings: file, an unencrypted connection, an unverified certificate, an unencrypted public address. Turn it off only for testing |
A setting that makes delivery impossible prevents startup and names the reason; so does
Alerts:Recipients without a Transport. none without recipients is the ordinary state.
Gateway:LoadLog
The load log in the log file next to the administration store; without a store, the service records nothing.
"Gateway": {
"LoadLog": { "PersonDays": 3, "SlowMilliseconds": 2000 }
}
| Setting | Default | Meaning |
|---|---|---|
Enabled | true | Record the load per shape; when off, it costs one check per request |
HourDays | 400 | Retention of the hourly figures per shape in days (1–3650); also the upper limit for export-load |
PersonDays | 7 | Retention of the daily figures per person in days (1–90) |
SlowDays | 7 | Retention of the single slow requests in days (1–90) |
SlowMilliseconds | 1000 | From this duration in milliseconds on, a request is recorded individually (10–600000) |
The service doesn't record requests to /health. Within one minute, it holds at most 5,000
distinct shapes and 2,000 slow requests; anything beyond that isn't counted, and the service
reports it in its log.
Gateway:AuditLog
The access log (audit): every answered or refused request with caller, person, alias, resource,
target (key address or query), allowing access rule, method, and result, and every custom statement
with its text, never with parameter values. The service writes
it to the log category Wkl.Data.Gateway.Audit and, with an administration store, once a minute to
the log file. You read it through the AuditEntries
set of the administration API.
"Gateway": {
"AuditLog": { "Days": 180 }
}
| Setting | Default | Meaning |
|---|---|---|
Enabled | true | Record accesses and statements. When turned off, the service records none of them, neither in the log category nor in the log file; existing entries stay until their period ends |
Days | 90 | Retention in the log file, in days (1–3650). When the file reaches its size (Gateway:Store:LogMaxMegabytes), the service removes the oldest entries earlier |
Without an administration store, AuditEntries shows the last 10,000 entries since the service
started; the log category is then the only lasting record.
Data protection: The target of a request contains key and filter values, such as a contract number
or a name. They can be personal data and are kept as long as the rest of the entry (Days); choose
the period according to the purpose of the record.
Gateway:Certificate
"Gateway": {
"Certificate": { "Subject": "daten.example.local", "StoreLocation": "LocalMachine", "StoreName": "My" }
}
"Gateway": {
"Certificate": { "File": "zertifikat/gateway.pfx", "Password": "env:WKL_GW_CERT_PASSWORD" }
}
| Setting | Meaning |
|---|---|
Subject | name the certificate is issued to (common name or DNS name), in the Windows certificate store; Windows only |
StoreLocation, StoreName | location in the certificate store, default LocalMachine and My; StoreLocation is LocalMachine or CurrentUser |
File | certificate file (PFX, or PEM with the key in KeyFile or in the same file), on every platform; relative to the content root |
KeyFile | file with the private key for a PEM file in File; empty if it's in the same file |
Password | reference (env: or file:) to the password of a PFX file |
WarnDays | how many days before expiry the service status starts warning, 1 to 365, default 14 (under 3 days: bad) |
Effect and change without restart: HTTPS and certificate.
Gateway:Downloads
| Key | Default | Meaning |
|---|---|---|
Path | downloads | folder of the installation packages for /download/, relative to the content root; empty turns downloading off |
Gateway:SchemaState
| Key | Default | Meaning |
|---|---|---|
Anonymous | false | true: schema state also without sign-in. Product, schema version, and version range reveal an application's patch level; turn it on only when every computer that reaches the service may know it |
Gateway:Updates
The update module applies database updates to the databases for which this folder holds a protected configuration. Without the data service, the WKL Database Update service does this with the same configuration files.
| Key | Default | Meaning |
|---|---|---|
Folder | %ProgramData%\Wkl.Data.Gateway\updates | Folder of the protected configurations, one file <id>.json per database. setup-host (installation package) sets the folder updates in the data folder and creates it so that only Administrators and System can change it |
PollSeconds | 15 | Seconds between two passes, 5 to 60 |
A configuration counts only when no one but Administrators and SYSTEM can change the file and its
folder (the service account reads them) and the file name matches the id; otherwise the module
leaves the database out and names the reason in update-databases. The module connects with its own SQL Server login, never with the service's account; the password isn't in the file but in an environment
variable or in a file only Administrators, SYSTEM, and the service account can read:
{
"format": 1, "id": "demo-prod", "gatewayAlias": "demo", "product": "Demo", "dialect": "sqlserver",
"connection": { "string": "Server=sql01;Database=Demo;User ID=wkl_update;Encrypt=True",
"secret": "file:C:\\ProgramData\\Wkl.Data.Gateway\\secrets\\demo-update.txt" },
"keys": [ "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE…" ],
"inbox": "D:\\Updates\\Demo", "archive": "D:\\Updates\\Demo-Archiv",
"backup": { "mode": "native", "target": "D:\\Sicherung" }
}
keys are the public keys of the publishers the database trusts. With backup.mode native, the
module backs the database up before every package into the folder backup.target on the database
server; with external, IT takes the backups itself and every package waits for confirmation. starterSource
(optional) is the folder the module writes the schema state for the WKL Bootstrapper into. With no file in
the folder, the module does nothing.
Backup retention. After each new backup, the module deletes older backups of the same database, but
only a backup that has at least BackupKeepCount newer ones (default 10) and is older than
BackupKeepDays days (default 30; 0: only the count matters). The newest BackupKeepCount always remain. Both are set in `UpdateSettings`. Only
files the module created itself count (<database>-<yyyyMMdd-HHmmss>-<package>.bak, time in UTC); other
files in the folder are left alone. The module deletes through the file system, and only when it can see
the backup it just wrote under backup.target: on the same machine as SQL Server, or in a shared folder
both can reach (\\server\share\...). If the folder exists only on a different database server, the
module says so once in the service log and keeps every backup; IT then has to clean up.
Reports. The module reports what becomes of a package on the channels switched on for the database in the set `UpdateSettings`:
- Event log (default): the application log, source
Wkl.Data.Gateway. The installation registers the source (setup-host); without it, the service log says so once. - File: one file per day (UTC),
%ProgramData%\Wkl.Data.Gateway\logs\updates\<YYYY-MM-DD>.jsonl, with one JSON object per line (utc,database,product,event,file,schema,code,message). The folder is fixed; the module never deletes the files. - Mail: to the recipients of the database, through the service's mail settings (`Gateway:Mail`), with the same text as in the event log. The mail is sent outside the pass; a slow or unreachable mail server holds up no package.
| Event ID | event | Level | Meaning |
|---|---|---|---|
| 4101 | waiting | Warning | The package waits: for confirmation, a backup by IT, closed applications or the lock (code) |
| 4102 | announced | Information | A breaking package is announced and runs at its deadline |
| 4103 | done | Information | The package is applied |
| 4104 | failed | Error | The package was refused or failed and is in failed |
| 4105 | nextKey | Warning | The publisher announces a new key (SHA-256); it applies only once IT adds it to keys |
| 4106 | blocked | Warning | The deadline has come, but older applications are still open or not known yet |
The module reports a wait only when its reason changes, not at every pass.
Kestrel
Listening addresses and a fixed certificate according to the ASP.NET Core rules (Kestrel:Endpoints); see
HTTPS and certificate. Without this section,
--urls applies.
Remarks
- The startup check rejects contradictory settings instead of choosing one of them: duplicate keys, two rules of one caller for the same alias,
sqlon a read-only rule, a network with host bits set,RequireTotpfor service keys, unknown Windows accounts. SqlLogininAuthModerequires at least one data source withAllowSqlLoginsand at least one entry underSqlLogins. Without an administration store, a missing one prevents the start. With an administration store, the service starts and logs the gap, because the switch and the mappings can only be set there once the method is on; until then, a SQL Server sign-in ends with401. The other way around, both the start check and the administration refuseAllowSqlLoginsand mappings without the method. Order of steps: Set up a SQL Server login.- A changed configuration file takes effect only after a restart; changes in the administration store take effect immediately.
Example
An alias with custom statements and a caller that may use them:
{
"Gateway": {
"Databases": [
{ "Name": "fachdaten", "Provider": "sqlserver", "ConnectionString": "…",
"AllowPassThrough": true }
],
"Security": {
"Clients": [
{ "Id": "auswertung", "Databases": [ "fachdaten" ],
"Resources": [ "views", "sql" ], "Verbs": [ "GET", "POST" ], "ReadOnly": false }
]
}
}
}