Выражения политики в службе управления API
ОБЛАСТЬ ПРИМЕНЕНИЯ: все уровни Управление API
В этой статье описан синтаксис выражений политики C# 7. Каждое выражение имеет доступ к:
- неявно заданной переменной контекста;
- допустимому подмножеству типов платформы .NET Framework.
Синтаксис
- Выражения с одним оператором:
- Выражения с одним оператором заключаются в элементы
@(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 , , TryParse ToString |
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 , GetAddressBytes IsLoopback Parse TryParse ToString |
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 , , Length Value |
System.Text.RegularExpressions.CaptureCollection |
Count , Item |
System.Text.RegularExpressions.Group |
Captures , Success |
System.Text.RegularExpressions.GroupCollection |
Count , Item |
System.Text.RegularExpressions.Match |
Empty , , Groups Result |
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) Workspace |
context.Api |
Id : string IsCurrentRevision : bool Name : string Path : string Revision : string ServiceUrl : IUrl Version : string |
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 |
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 |
context.Workspace |
Id : string Name : string |
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 |
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 , если произошел сбой проверки. |
Связанный контент
Дополнительные сведения о работе с политиками см. в следующих статьях:
- Политики в управлении API
- Учебник. Преобразование и защита API
- Полный перечень операторов политик и их параметров см. в справочнике по политикам.
- Репозиторий фрагментов политик
- Создание политик с помощью Microsoft Copilot в Azure
Дополнительные сведения см. по ссылке .
- Способы передачи сведений о контексте во внутреннюю службу. Используйте политики настройки параметра строки запроса и настройки HTTP-заголовка, чтобы передать эти сведения.
- Использование политики проверки JWT для предварительной авторизации доступа к операциям на основе утверждений маркеров.
- Сведения об использовании трассировки с помощью инспектора API для определения способа оценки политик и просмотра результатов этой оценки.
- Использование выражений с политиками получения из кэша и хранения в кэше для настройки кэширования ответа службы управления API. Установите такую же длительность, как и для кэширования ответа во внутренней службе, которая задается директивой
Cache-Control
на сервере. - Сведения о том, как отфильтровать содержимое. Удалите элементы данных из ответа, полученного из внутренней службы с помощью политик потока управления и задания текста.
- Чтобы скачать инструкции политики, перейдите в репозиторий GitHub api-management-samples/policies.