Выражения политики в службе управления API

ОБЛАСТЬ ПРИМЕНЕНИЯ: все уровни Управление API

В этой статье описан синтаксис выражений политики C# 7. Каждое выражение имеет доступ к:

Синтаксис

  • Выражения с одним оператором:
    • Выражения с одним оператором заключаются в элементы @(expression), где expression — оператор выражения C# в соответствующем формате.
  • Выражения с несколькими операторами:
    • Заключены внутри @{expression}.
    • Все ветви кода в выражениях с несколькими операторами должны заканчиваться оператором return.

Примеры

@(true)

@((1+1).ToString())

@("Hi There".Length)

@(Regex.Match(context.Response.Headers.GetValueOrDefault("Cache-Control",""), @"max-age=(?<maxAge>\d+)").Groups["maxAge"]?.Value)

@(context.Variables.ContainsKey("maxAge") ? int.Parse((string)context.Variables["maxAge"]) : 3600)

@{
  string[] value;
  if (context.Request.Headers.TryGetValue("Authorization", out value))
  {
      if(value != null && value.Length > 0)
      {
          return Encoding.UTF8.GetString(Convert.FromBase64String(value[0]));
      }
  }
  return null;

}

Использование

Если в справочнике по политике не указано иное, выражения можно использовать в качестве значений атрибутов или текстовых значений в любой политике службы управления API.

Внимание

Если политика определена, выражения политики имеют ограниченную проверку. Выражения выполняются шлюзом во время выполнения. Генерируемые политикой исключения приводят к ошибкам времени выполнения.

платформа .NET Framework типы, разрешенные в выражениях политики

В следующей таблице перечислены типы .NET Framework и их члены, которые можно использовать в выражениях политики.

Тип Поддерживаемые члены
Newtonsoft.Json.Formatting Все
Newtonsoft.Json.JsonConvert SerializeObject, DeserializeObject
Newtonsoft.Json.Linq.Extensions Все
Newtonsoft.Json.Linq.JArray Все
Newtonsoft.Json.Linq.JConstructor Все
Newtonsoft.Json.Linq.JContainer Все
Newtonsoft.Json.Linq.JObject Все
Newtonsoft.Json.Linq.JProperty Все
Newtonsoft.Json.Linq.JRaw Все
Newtonsoft.Json.Linq.JToken Все
Newtonsoft.Json.Linq.JTokenType Все
Newtonsoft.Json.Linq.JValue Все
System.Array Все
System.BitConverter Все
System.Boolean Все
System.Byte Все
System.Char Все
System.Collections.Generic.Dictionary<TKey, TValue> Все
System.Collections.Generic.HashSet<T> Все
System.Collections.Generic.ICollection<T> Все
System.Collections.Generic.IDictionary<TKey, TValue> Все
System.Collections.Generic.IEnumerable<T> Все
System.Collections.Generic.IEnumerator<T> Все
System.Collections.Generic.IList<T> Все
System.Collections.Generic.IReadOnlyCollection<T> Все
System.Collections.Generic.IReadOnlyDictionary<TKey, TValue> Все
System.Collections.Generic.ISet<T> Все
System.Collections.Generic.KeyValuePair<TKey, TValue> Все
System.Collections.Generic.List<T> Все
System.Collections.Generic.Queue<T> Все
System.Collections.Generic.Stack<T> Все
System.Convert Все
System.DateTime (Конструктор), Add, AddDays, AddHours, AddMilliseconds, AddMinutes, AddMonths, AddSeconds, AddTicks, AddYears, Date, Day, DayOfWeek, DayOfYear, DaysInMonth, Hour, IsDaylightSavingTime, IsLeapYear, MaxValue, Millisecond, Minute, MinValue, Month, Now, Parse, Second, Subtract, Ticks, TimeOfDay, Today, ToString, UtcNow, Year
System.DateTimeKind Utc
System.DateTimeOffset Все
System.Decimal Все
System.Double Все
System.Enum Parse, , TryParseToString
System.Exception Все
System.Guid Все
System.Int16 Все
System.Int32 Все
System.Int64 Все
System.IO.StringReader Все
System.IO.StringWriter Все
System.Linq.Enumerable Все
System.Math Все
System.MidpointRounding Все
System.Net.IPAddress AddressFamily, Equals, GetAddressBytesIsLoopbackParseTryParseToString
System.Net.WebUtility Все
System.Nullable Все
System.Random Все
System.SByte Все
System.Security.Cryptography.AsymmetricAlgorithm Все
System.Security.Cryptography.CipherMode Все
System.Security.Cryptography.HashAlgorithm Все
System.Security.Cryptography.HashAlgorithmName Все
System.Security.Cryptography.HMAC Все
System.Security.Cryptography.HMACMD5 Все
System.Security.Cryptography.HMACSHA1 Все
System.Security.Cryptography.HMACSHA256 Все
System.Security.Cryptography.HMACSHA384 Все
System.Security.Cryptography.HMACSHA512 Все
System.Security.Cryptography.KeyedHashAlgorithm Все
System.Security.Cryptography.MD5 Все
System.Security.Cryptography.Oid Все
System.Security.Cryptography.PaddingMode Все
System.Security.Cryptography.RNGCryptoServiceProvider Все
System.Security.Cryptography.RSA Все
System.Security.Cryptography.RSAEncryptionPadding Все
System.Security.Cryptography.RSASignaturePadding Все
System.Security.Cryptography.SHA1 Все
System.Security.Cryptography.SHA1Managed Все
System.Security.Cryptography.SHA256 Все
System.Security.Cryptography.SHA256Managed Все
System.Security.Cryptography.SHA384 Все
System.Security.Cryptography.SHA384Managed Все
System.Security.Cryptography.SHA512 Все
System.Security.Cryptography.SHA512Managed Все
System.Security.Cryptography.SymmetricAlgorithm Все
System.Security.Cryptography.X509Certificates.PublicKey Все
System.Security.Cryptography.X509Certificates.RSACertificateExtensions Все
System.Security.Cryptography.X509Certificates.X500DistinguishedName Name
System.Security.Cryptography.X509Certificates.X509Certificate Все
System.Security.Cryptography.X509Certificates.X509Certificate2 Все
System.Security.Cryptography.X509Certificates.X509ContentType Все
System.Security.Cryptography.X509Certificates.X509NameType Все
System.Single Все
System.String Все
System.StringComparer Все
System.StringComparison Все
System.StringSplitOptions Все
System.Text.Encoding Все
System.Text.RegularExpressions.Capture Index, , LengthValue
System.Text.RegularExpressions.CaptureCollection Count, Item
System.Text.RegularExpressions.Group Captures, Success
System.Text.RegularExpressions.GroupCollection Count, Item
System.Text.RegularExpressions.Match Empty, , GroupsResult
System.Text.RegularExpressions.Regex (Конструктор), IsMatch, Match, Matches, Replace, Unescape, Split
System.Text.RegularExpressions.RegexOptions Все
System.Text.StringBuilder Все
System.TimeSpan Все
System.TimeZone Все
System.TimeZoneInfo.AdjustmentRule Все
System.TimeZoneInfo.TransitionTime Все
System.TimeZoneInfo Все
System.Tuple Все
System.UInt16 Все
System.UInt32 Все
System.UInt64 Все
System.Uri Все
System.UriPartial Все
System.Xml.Linq.Extensions Все
System.Xml.Linq.XAttribute Все
System.Xml.Linq.XCData Все
System.Xml.Linq.XComment Все
System.Xml.Linq.XContainer Все
System.Xml.Linq.XDeclaration Все
System.Xml.Linq.XDocument Все, кроме Load
System.Xml.Linq.XDocumentType Все
System.Xml.Linq.XElement Все
System.Xml.Linq.XName Все
System.Xml.Linq.XNamespace Все
System.Xml.Linq.XNode Все
System.Xml.Linq.XNodeDocumentOrderComparer Все
System.Xml.Linq.XNodeEqualityComparer Все
System.Xml.Linq.XObject Все
System.Xml.Linq.XProcessingInstruction Все
System.Xml.Linq.XText Все
System.Xml.XmlNodeType Все

Переменная контекста

Переменная context неявно доступна в каждом выражении политики. Ее элементы:

  • Укажите сведения, относящиеся к запросу и ответу API, а также связанные свойства.
  • Все доступны только для чтения.
Переменная контекста Допустимые методы, свойства и значения параметров
context Api: IApi

Deployment

Elapsed: TimeSpan — интервал времени между значением Timestamp и текущим временем.

GraphQL

LastError

Operation

Request

RequestId: Guid — уникальный идентификатор запроса.

Response

Subscription

Timestamp: DateTime — время получения запроса.

Tracing: bool — указывает, включена или отключена трассировка

Пользователь

Variables: IReadOnlyDictionary<string, object>

void Trace(message: string)
context.Api Id: string

IsCurrentRevision: bool

Name: string

Path: string

Revision: string

ServiceUrl: IUrl

Version: string

Workspace: IWorkspace
context.Deployment Gateway

GatewayId: string (для управляемых шлюзов возвращает значение managed).

Region: string

ServiceId: string

ServiceName: string

Certificates: IReadOnlyDictionary<string, X509Certificate2>
context.Deployment.Gateway Id: string (для управляемых шлюзов возвращает значение managed).

InstanceId: string (для управляемых шлюзов возвращает значение managed).

IsManaged: bool
context.GraphQL GraphQLArguments: IGraphQLDataObject

Parent: IGraphQLDataObject

Примеры
context.LastError Source: string

Reason: string

Message: string

Scope: string

Section: string

Path: string

PolicyId: string

Дополнительные сведения о context.LastError см. в статье Обработка ошибок.
context.Operation Id: string

Method: string

Name: string

UrlTemplate: string
context.Product ApprovalRequired: bool

Groups: IEnumerable<IGroup>

Id: string

Name: string

State: enum ProductState {NotPublished, Published}

SubscriptionsLimit: int?

SubscriptionRequired: bool

Workspace: IWorkspace
context.Request Body: IMessageBody или null, если в запросе нет текста.

Certificate: System.Security.Cryptography.X509Certificates.X509Certificate2

Headers: IReadOnlyDictionary<string, string[]>

IpAddress: string

MatchedParameters: IReadOnlyDictionary<string, string>

Method: string

OriginalUrl: IUrl

Url: IUrl

PrivateEndpointConnection: IPrivateEndpointConnection или null, если запрос поступил не от подключения частной командной точки.
string context.Request.Headers.GetValueOrDefault(headerName: string, defaultValue: string) headerName: string

defaultValue: string

Возвращает значения заголовков запросов, разделенные запятыми, или значение defaultValue, если заголовок не найден.
context.Response Body: IMessageBody

Headers: IReadOnlyDictionary<string, string[]>

StatusCode: int

StatusReason: string
string context.Response.Headers.GetValueOrDefault(headerName: string, defaultValue: string) headerName: string

defaultValue: string

Возвращает значения заголовков ответов, разделенные запятыми, или значение defaultValue, если заголовок не найден.
context.Subscription CreatedDate: DateTime

EndDate: DateTime?

Id: string

Key: string

Name: string

PrimaryKey: string

SecondaryKey: string

StartDate: DateTime?
context.User Email: string

FirstName: string

Groups: IEnumerable<IGroup>

Id: string

Identities: IEnumerable<IUserIdentity>

LastName: string

Note: string

RegistrationDate: DateTime
IApi Id: string

Name: string

Path: string

Protocols: IEnumerable<string>

ServiceUrl: IUrl

SubscriptionKeyParameterNames: ISubscriptionKeyParameterNames
IGraphQLDataObject Подлежит уточнению

IGroup Id: string

Name: string
IMessageBody As<T>(bool preserveContent = false): Where T: string, byte[], JObject, JToken, JArray, XNode, XElement, XDocument

— Методы context.Request.Body.As<T> считывают context.Response.Body.As<T> текст запроса или ответа в указанном типе T.

-Или-

AsFormUrlEncodedContent(bool preserveContent = false)

— Данные context.Request.Body.AsFormUrlEncodedContent() формы, закодированные URL-адресом, и context.Response.Body.AsFormUrlEncodedContent() методы считываются в тексте сообщения запроса или ответа и возвращают IDictionary<string, IList<string> объект. Декодированные объекты поддерживают IDictionary операции и следующие выражения: ToQueryString(), JsonConvert.SerializeObject()ToFormUrlEncodedContent().

По умолчанию методы As<T> и AsFormUrlEncodedContent() методы:
  • Используйте исходный поток текста сообщения.
  • Отрисовка недоступной после возврата.

Чтобы избежать этого и использовать метод, работающий с копией потока тела, задайте preserveContent для параметра значение true, как показано в примерах политики набора текста .
IPrivateEndpointConnection Name: string

GroupId: string

MemberName: string

Дополнительные сведения см. в разделе REST API.
IUrl Host: string

Path: string

Port: int

Query: IReadOnlyDictionary<string, string[]>

QueryString: string

Scheme: string
ISubscriptionKeyParameterNames Header: string

Query: string
string IUrl.Query.GetValueOrDefault(queryParameterName: string, defaultValue: string) queryParameterName: string

defaultValue: string

Возвращает разделенные запятыми значения параметров запроса или значение defaultValue, если параметр не найден.
IUserIdentity Id: string

Provider: string
IWorkspace Id: string

Name: string
T context.Variables.GetValueOrDefault<T>(variableName: string, defaultValue: T) variableName: string

defaultValue: T

Возвращает значение переменной, приведенное к типу T или defaultValue, если переменная не найдена.

Этот метод выдает исключение, если указанный тип не соответствует фактическому типу возвращаемой переменной.
BasicAuthCredentials AsBasic(input: this string) input: string

Если входной параметр содержит допустимое значение заголовка запроса авторизации для обычной проверки подлинности HTTP, метод возвращает объект типа BasicAuthCredentials; в противном случае метод возвращает значение NULL.
bool TryParseBasic(input: this string, result: out BasicAuthCredentials) input: string

result: out BasicAuthCredentials

Если входной параметр содержит допустимое значение заголовка запроса авторизации для обычной проверки подлинности и HTTP, метод возвращает значение true, а параметр результата содержит значение типа BasicAuthCredentials. В противном случае метод возвращает значение false.
BasicAuthCredentials Password: string

UserId: string
Jwt AsJwt(input: this string) input: string

Если входной параметр содержит допустимое значение маркера JWT, метод возвращает объект типа Jwt; в противном случае метод возвращает значение null.
bool TryParseJwt(input: this string, result: out Jwt) input: string

result: out Jwt

Если входной параметр содержит допустимое значение маркера JWT, метод возвращает значение true, а параметр результата содержит значение типа Jwt; в противном случае метод возвращает значение false.
Jwt Algorithm: string

Audiences: IEnumerable<string>

Claims: IReadOnlyDictionary<string, string[]>

ExpirationTime: DateTime?

Id: string

Issuer: string

IssuedAt: DateTime?

NotBefore: DateTime?

Subject: string

Type: string
string Jwt.Claims.GetValueOrDefault(claimName: string, defaultValue: string) claimName: string

defaultValue: string

Возвращает значения утверждений, разделенные запятыми, или значение defaultValue, если заголовок не найден.
byte[] Encrypt(input: this byte[], alg: string, key:byte[], iv:byte[]) input — открытый текст, который нужно зашифровать.

alg — имя алгоритма симметричного шифрования.

key — ключ шифрования.

iv — вектор инициализации.

Возвращает открытый текст в зашифрованном виде.
byte[] Encrypt(input: this byte[], alg: System.Security.Cryptography.SymmetricAlgorithm) input — открытый текст, который нужно зашифровать.

alg — алгоритм шифрования.

Возвращает открытый текст в зашифрованном виде.
byte[] Encrypt(input: this byte[], alg: System.Security.Cryptography.SymmetricAlgorithm, key:byte[], iv:byte[]) input — открытый текст, который нужно зашифровать.

alg — алгоритм шифрования.

key — ключ шифрования.

iv — вектор инициализации.

Возвращает открытый текст в зашифрованном виде.
byte[] Decrypt(input: this byte[], alg: string, key:byte[], iv:byte[]) input — зашифрованный текст, который нужно расшифровать.

alg — имя алгоритма симметричного шифрования.

key — ключ шифрования.

iv — вектор инициализации.

Возвращает открытый текст.
byte[] Decrypt(input: this byte[], alg: System.Security.Cryptography.SymmetricAlgorithm) input — зашифрованный текст, который нужно расшифровать.

alg — алгоритм шифрования.

Возвращает открытый текст.
byte[] Decrypt(input: this byte[], alg: System.Security.Cryptography.SymmetricAlgorithm, key:byte[], iv:byte[]) input — зашифрованный текст, который нужно расшифровать.

alg — алгоритм шифрования.

key — ключ шифрования.

iv — вектор инициализации.

Возвращает открытый текст.
bool VerifyNoRevocation(input: this System.Security.Cryptography.X509Certificates.X509Certificate2) Выполняет проверку цепочки X.509 без проверки состояния отзыва сертификата.

input — объект сертификата.

Возвращает true, если проверка прошла успешно, или false, если произошел сбой проверки.

Дополнительные сведения о работе с политиками см. в следующих статьях:

Дополнительные сведения см. по ссылке .

  • Способы передачи сведений о контексте во внутреннюю службу. Используйте политики настройки параметра строки запроса и настройки HTTP-заголовка, чтобы передать эти сведения.
  • Использование политики проверки JWT для предварительной авторизации доступа к операциям на основе утверждений маркеров.
  • Сведения об использовании трассировки с помощью инспектора API для определения способа оценки политик и просмотра результатов этой оценки.
  • Использование выражений с политиками получения из кэша и хранения в кэше для настройки кэширования ответа службы управления API. Установите такую же длительность, как и для кэширования ответа во внутренней службе, которая задается директивой Cache-Control на сервере.
  • Сведения о том, как отфильтровать содержимое. Удалите элементы данных из ответа, полученного из внутренней службы с помощью политик потока управления и задания текста.
  • Чтобы скачать инструкции политики, перейдите в репозиторий GitHub api-management-samples/policies.