* Fixes #49

Fix the Deploy to Azure button

* Update Lab 7 Security Screenshots

* Update Lab 8 DevOps Screenshots

* Update Lab 10 Additional Topics Screenshots

* Clean up and remove obsolete screenshots

* Fix wrong paths to images
This commit is contained in:
Simon Kurtz 2022-01-17 12:01:58 -05:00 коммит произвёл GitHub
Родитель 852d574409
Коммит 58b6e02b3a
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
175 изменённых файлов: 92 добавлений и 98 удалений

Просмотреть файл

@ -1,6 +1,6 @@
<img style="float: left;" src="assets/images/APIM.png">
<img style="float: left;" src="assets/images/apim.png">
# About this workshop

Просмотреть файл

@ -9,7 +9,7 @@ nav_order: 2
An instance can take some time to provision. Expect ~45-75 minutes. Therefore, please create an instance prior to any demo.
[![Deploy to Azure](https://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.ApiManagement)
[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.ApiManagement)
Using either your own or [Azure's common naming convention](https://docs.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/resource-naming), fill in each required field and press *Review + Create*, followed by *Create* to provision the service. Once started, it is not necessary to remain on this page or in the Azure Portal. If you entered a valid email address, you will receive a provisioning completion email.

Просмотреть файл

@ -17,7 +17,7 @@ In this section we provide you with a template architecture diagram for your api
- What products are we going to define?
- What teams and processess need to be in place to manage the Azure Apim?
![](../../assets/images/apimADSv2.png)
![](../../assets/images/apim-architecture-design-session-v2.png)
| <a href="https://app.diagrams.net/#Uhttps%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fapim-lab%2Fmain%2Fassets%2Fdiagrams%2FapimADSv2.drawio" target="_blank">Edit As New</a>
Download Diagram:

Просмотреть файл

@ -10,8 +10,6 @@ nav_order: 2
Some of the demos use the ColourWeb web application and the ColourAPI API application. In this lab we will show you how to deploy your own instances of the Colours Web and Colours API. Note - ColoursWeb / ColoursAPI is new version of ColorsWeb/ColorsAPI ... do not mix the web client and API versions.
![](../../assets/images/APIMColorWebUnlimited.png)
The code for the ColourWeb / ColourAPI applications is available here:
- [ColourWeb](https://github.com/markharrison/ColoursWeb)
@ -34,7 +32,7 @@ With the container we can deploy to multiple hosting options : VM's, App Service
1. Login to Azure Portal at http://portal.azure.com.
2. Open the Azure Cloud Shell and choose Bash Shell (do not choose Powershell)
![Azure Cloud Shell](../../assets/images/img-cloud-shell.png "Azure Cloud Shell")
![Azure Cloud Shell](../../assets/images/azure-cloud-shell.png "Azure Cloud Shell")
3. The first time Cloud Shell is started will require you to create a storage account.
4. We proceed to create a unique identifier suffix for resources created in this Lab:
@ -99,7 +97,7 @@ With the container we can deploy to multiple hosting options : VM's, App Service
Once we have a "Succeeded" message we proceed to navigate to the FQDN. And we should see our home page for our Colours Web:
![](../../assets/images/APIMACICOLORWEB.png)
![](../../assets/images/apim-aci-color-web.png)
8. Now we proceed to create the ACI for the colors-api github container:
@ -135,4 +133,4 @@ With the container we can deploy to multiple hosting options : VM's, App Service
Once we have a "Succeeded" message we proceed to navigate to the FQDN. And we should see our home page (Swagger UI) for our Colours API:
![](../../assets/images/APIMACICOLORAPI.png)
![](../../assets/images/apim-aci-color-api.png)

Просмотреть файл

@ -15,7 +15,7 @@ Azure Serverless (Functions and Logic Apps) can be configured to benefit from th
Example:
![](../../assets/images/APIMFunctionExample.png)
![](../../assets/images/apim-azure-function-example.png)
```c#
//string[] strColors = { "blue", "lightblue", "darkblue" };
@ -29,29 +29,29 @@ Example:
Lets add the function to API Management. In the API blade select [+Add API] and the [Function App] tile
![](../../assets/images/APIMFunctionAddAPI.png)
![](../../assets/images/apim-azure-function-add-api.png)
- Select the [Browse] button to get a list of Functions in the subscription
![](../../assets/images/APIMFunctionAddBrowse.png)
![](../../assets/images/apim-azure-function-add-browse.png)
- Select the Function App and then the Function
![](../../assets/images/APIMFunctionSelect.png)
![](../../assets/images/apim-azure-function-select-1.png)
![](../../assets/images/APIMFunctionSelect2.png)
![](../../assets/images/apim-azure-function-select-2.png)
- Amend the Names / Descriptions, URL suffix and select the Products
![](../../assets/images/APIMFunctionCreate.png)
![](../../assets/images/apim-azure-function-create.png)
- As previously add CORS policy
- Validate the function works - either from the Azure management portal or the developer portal
![](../../assets/images/APIMFunctionTest1.png)
![](../../assets/images/apim-azure-function-test-1.png)
![](../../assets/images/APIMFunctionTest2.png)
![](../../assets/images/apim-azure-function-test-2.png)
### Azure Logic Apps
@ -59,9 +59,9 @@ Lets add the function to API Management. In the API blade select [+Add API] an
Example:
![](../../assets/images/APIMLogicAppExample1.png)
![](../../assets/images/apim-logic-app-example-1.png)
![](../../assets/images/APIMLogicAppExample2.png)
![](../../assets/images/apim-logic-app-example-2.png)
Use the following sample message to generate the schema of the Request body payload. By specifying the schema, the individual fields (in this case `msg`) can be extracted and referred to in the subsequent logic
@ -73,34 +73,34 @@ Use the following sample message to generate the schema of the Request body payl
Lets add the function to API Managament. In the API blade select [+Add API] and the [Logic App] tile
![](../../assets/images/APIMLogicAppAddAPI.png)
![](../../assets/images/apim-logic-app-add-api.png)
- Select the [Browse] button to get a list of Logic Apps in the subscription
![](../../assets/images/APIMLogicAppAddBrowse.png)
![](../../assets/images/apim-logic-app-add-browse.png)
- Select the Logic App
![](../../assets/images/APILogicAppSelect%20.png)
![](../../assets/images/apim-logic-app-select.png)
- Amend the Names / Descriptions, URL suffix and select the Products
![](../../assets/images/APIMLogicAppCreate.png)
![](../../assets/images/apim-logic-app-create.png)
As previously add CORS policy
- Validate the Logic App works - either from the Azure management portal or the developer poral
![](../../assets/images/APIMLogicAppTest1.png)
![](../../assets/images/apim-logic-app-test-1.png)
![](../../assets/images/APIMLogicAppTest2.png)
![](../../assets/images/apim-logic-app-test-2.png)
- Check the Logic App audit
![](../../assets/images/APIMLogicAppTest3.png)
![](../../assets/images/apim-logic-app-test-3.png)
- Check the email was sent
![](../../assets/images/APIMLogicAppTest4.png)
![](../../assets/images/apim-logic-app-test-4.png)

Просмотреть файл

@ -29,23 +29,23 @@ To deploy a self-hosted gateway:
- Select `+ Add`
![](../../assets/images/APIMGWDeploy1.png)
![](../../assets/images/apim-app-gateway-deploy-1.png)
- Enter a Name and Location for the Gateway
- Select the required APIs from those that are configured in the APIM instance
- Our lab will use the Color API - this was configured in an earlier module
- Select the `Add` button
![](../../assets/images/APIMGWDeploy2.png)
![](../../assets/images/apim-app-gateway-deploy-2.png)
The added gateway will appear in the list ... this is the Gateway Deployment.
![](../../assets/images/APIMGWDeploy3.png)
![](../../assets/images/apim-app-gateway-deploy-3.png)
- Click on the gateway in the list - a blade appears allowing further configuration
![](../../assets/images/APIMGWDeploy4.png)
![](../../assets/images/apim-app-gateway-deploy-4.png)
- Select the `Deployment` option from the menu
- There are scripts for deploying on Docker and Kuberenetes ... for this lab, we will be using the Docker option
@ -56,29 +56,29 @@ The added gateway will appear in the list ... this is the Gateway Deployment.
docker run -p 80:8080 -p 443:8081 --name OnPremiseGateway --env-file env.conf mcr.microsoft.com/azure-api-management/gateway:latest
```
![](../../assets/images/APIMGWDeploy5.png)
![](../../assets/images/apim-app-gateway-deploy-5.png)
From a command line - elevated to Administrator (needed for Docker commands)
- Navigate to the location where the *env.conf* is located
- Run the Docker run command
![](../../assets/images/APIGWMDeploy6.png)
![](../../assets/images/apim-app-gateway-deploy-6.png)
The first time this is executed, it will need to pull down the Docker image - and so there will be a small delay. Subsequently - if restarted - it will just use the downloaded image.
![](../../assets/images/APIMGWDeploy7.png)
![](../../assets/images/apim-app-gateway-deploy-7.png)
Once downloaded, the log output from the container will display a Sputnik logo (this was an internal code name) and some diagnostic logs.
![](../../assets/images/APIMGWDeploy8.png)
![](../../assets/images/apim-app-gateway-deploy-8.png)
![](../../assets/images/APIMGWDeploy9.png)
![](../../assets/images/apim-app-gateway-deploy-9.png)
Note that in the Gateway blade we can see the status - it will show there is one healthy Gateway Node connected to the Deployment. The Gateway Node will keep in sync, and be automatically updated should any of the Gateway Deployment config changes.
![](../../assets/images/APIMGWDeploy10.png)
![](../../assets/images/apim-app-gateway-deploy-10.png)
## Testing the API
@ -88,15 +88,15 @@ Our Gateway Node is now deployed - and we can test that it works.
- Open Notepad - make note of URLs including the key. For our lab test, the machine name is just *localhost*
- https://localhost/color/api/RandomColor?key=Unlimited-Key
![](../../assets/images/APIMGWTest1.png)
![](../../assets/images/apim-app-gateway-test-1.png)
- Use a tool like [Postman](https://www.postman.com/) to test the API ... should see the random color appear in the response and this confirms everything is working properly
- If tested with a browser, then a warning needs to accepted to proceed - this is because trusted TLS certificates have not been set up
![](../../assets/images/APIMGWTest2.png)
![](../../assets/images/apim-app-gateway-test-2.png)
Diagnostics for the API call will be logged by the container.
![](../../assets/images/APIMGWTest3.png)
![](../../assets/images/apim-app-gateway-test-3.png)

Просмотреть файл

@ -28,7 +28,7 @@ A product contains one or more APIs as well as a usage quota and the terms of us
Press *Add group*, check *Developers* and *Guests*, then press *Select*. The two added roles are shown now.
![APIM Add Product Access](../../assets/images/apim-add-product-access-1.png)
![APIM Add Product Access](../../assets/images/apim-add-product-access-2.png)
Back in the private browsing session, browse to *Products* and observe the new *Gold Tier*.

Просмотреть файл

@ -49,11 +49,11 @@ First, we need to enable CORS for the domain name of the frontend. To achieve th
- Inside the `Inbound processing` area you will see the `cors` policy, which we added in part 2 by pressing the `Enable Cors` button.
- Click on the pencil icon next to that policy to edit it.
![APIM Policy CORS All APIs](../../assets/images/apim-policy-cors-all-apis.png)
![APIM Policy CORS All APIs](../../assets/images/apim-policy-cors-all-apis-1.png)
- Here we will see this form where we can add the domain name of our frontend `https://markcolorweb.azurewebsites.net` or the `*` for all domains. Press *Add allowed origin*, enter the URL, then press *Save*.
![APIM Policy CORS All APIs](../../assets/images/apim-policy-cors-all-apis2.png)
![APIM Policy CORS All APIs](../../assets/images/apim-policy-cors-all-apis-2.png)
- After enabling CORS in APIM lets go back to our frontend <https://markcolorweb.azurewebsites.net> and follow these steps:

Просмотреть файл

@ -12,7 +12,7 @@ The [cors policy](<https://docs.microsoft.com/en-us/azure/api-management/api-man
We have already configured the *cors* policy for our APIs in labs 2 & 3. Below is the resulting XML:
![APIM Policy CORS All APIs](../../assets/images/apim-policy-cors-all-apis.png)
![APIM Policy CORS All APIs](../../assets/images/apim-policy-cors-all-apis-1.png)
```xml
<policies>

Просмотреть файл

@ -47,7 +47,7 @@ To create an event hub within the namespace, follow these steps:
1. From the **Event Hubs** blade select **+ Event Hub**>
![Add Event Hub](../../assets/images/event-hub-create.png)
![Add Event Hub](../../assets/images/event-hub-create-1.png)
1. Type a name for your event hub, then select **Create**.
@ -137,7 +137,7 @@ Once your logger is configured in API Management, you can configure your log-to-
1. Select **Show snippets**.
1. In the window on the right, select **Advanced policies** > **Log to EventHub**. This inserts the `log-to-eventhub` policy statement template.
![APIM Add Log to Event Hub](../../assets/images/apim-add-log-to-event-hub.png)
![APIM Add Log to Event Hub](../../assets/images/apim-add-log-to-event-hub-1.png)
1. Replace the policy with this snippet:

Просмотреть файл

@ -7,15 +7,16 @@ nav_order: 1
## Security
In this lab, we are going to see how to use JSON Web Tokens with your APIs.
### JSON Web Tokens (JWT)
JSON Web Tokens are an open-industry standard method for representing claims securely between two parties. More info at <https://jwt.io/>
JSON Web Tokens are an open-industry standard method for representing claims securely between two parties. More info at <https://jwt.io>.
- Use the following sites
- <https://www.unixtimestamp.com/index.php>, in this website we need to get a date in the future using the epoch unix timestamp, be sure to get a timestamp at least 1 hour in the future, otherwise the JWT will not work.
- i.e. 01/11/2029 = 1862842300
- <https://jwt.io/> to create a JWT. Please add the following to your JWT
- In the payload area use a similar payload to this one:
Use the following sites:
- <https://www.unixtimestamp.com> to get a future date using the Epoch Unix Timestamp _at least one hour from the current time_ as the JWT will not work otherwise (e.g. 01/11/2029 = `1862842300`)
- <https://jwt.io> to create a JWT with payload modeled after this one:
```json
{
"sub": "1234567890",
@ -24,31 +25,26 @@ JSON Web Tokens are an open-industry standard method for representing claims sec
"exp": 1862842300
}
```
- In the signature area use a key that matches the value in the policy expression e.g. `123412341234123412341234`, also be sure to check the option that says **secret base64 encoded**.
- In the signature area use a key that matches the value in the policy expression (see below - e.g. `123412341234123412341234`). Also be sure to check the option that says **secret base64 encoded**.
- Your configuration should be similar as in this image:
- Your configuration should be similar to this:
![](../../assets/images/jwt-io.png)
![](../../assets/images/APIMJWT.png)
### JSON Web Tokens (JWT) - validate
In this lab, we are going to see how to use the token with your APIs
- Open the Calculator API 'Code View',
- Add the inbound policy to validate the JWT. The example shows the use of variables in an expression - useful if a value is repeated.
#### JSON Web Tokens (JWT) - validate
Open the Calculator API 'Code View'
- Add the inbound policy to validate that JWT is valid
- The example shows the use of variables in an expression - useful if a value is repeated
```xml
<!-- Inbound -->
<set-variable name="signingKey" value="123412341234123412341234" />
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized">
<issuer-signing-keys>
<key>@((string)context.Variables["signingKey"])</key>
</issuer-signing-keys>
</validate-jwt>
```
```xml
<!-- Inbound -->
<set-variable name="signingKey" value="123412341234123412341234" />
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized">
<issuer-signing-keys>
<key>@((string)context.Variables["signingKey"])</key>
</issuer-signing-keys>
</validate-jwt>
```
- Invoke the API ... should get a [401 Unauthorized error]
- Invoke the API with a request header containing the security token (got above from <https://jwt.io/>) ... should get a 200 success
@ -57,14 +53,14 @@ Open the Calculator API 'Code View'
No JWT:
![](../../assets/images/APIMRequestJWTnone.png)
![](../../assets/images/apim-request-no-jwt.png)
Valid JWT in the header:
Note the bearer token in the Request payload.
Make sure your JWT token has an expiry date in the future.
![](../../assets/images/APIMRequestJWTvalid.png)
![](../../assets/images/apim-request-valid-jwt.png)
#### JSON Web Tokens (JWT) - check a claim exists
@ -91,7 +87,7 @@ Make sure your JWT token has an expiry date in the future.
Checking for admin claim:
![](../../assets/images/APIMRequestJWTclaimvalid.png)
![](../../assets/images/apim-request-valid-jwt-and-claim.png)
Checking for adminx claim:
@ -99,7 +95,7 @@ Checking for adminx claim:
<claim name="adminx" match="any">
```
![](../../assets/images/APIMRequestJWTclaiminvalid.png)
![](../../assets/images/apim-request-valid-jwt-invalid-request.png)
#### JSON Web Tokens (JWT) - extract claim and pass to backend
@ -123,5 +119,5 @@ Checking for adminx claim:
</set-header>
```
![Claim in header](../../assets/images/APIMHeaderJWTClaimBackend.png)
![Claim in trace](../../assets/images/APIMTraceJWTClaimBackend.png)
![Claim in header](../../assets/images/apim-jwt-claim-in-header.png)
![Claim in trace](../../assets/images/apim-jwt-claim-in-trace.png)

Просмотреть файл

@ -14,7 +14,7 @@ In Azure, an Active Directory identity can be assigned to a managed resource suc
#### Register API Management with Active Directory
![Register APIM](../../assets/images/APIMSecurityRegisterPrincipal.png)
![Register APIM](../../assets/images/apim-security-register-principal.png)
#### Key Vault - Create Key Vault and add a secret
@ -23,34 +23,34 @@ In Azure, an Active Directory identity can be assigned to a managed resource suc
- Name:`favoritePerson`
- Value: `3`
![Create Key Vault](../../assets/images/APIMSecurityCreateKV.png)
![Create Key Vault](../../assets/images/apim-security-create-key-vault.png)
#### Key Vault - Access policy and principal assignment
Create an access policy
![Create Key Vault](../../assets/images/APIMSecurityKV1.jpg)
![Create Key Vault](../../assets/images/apim-security-key-vault-1.jpg)
Select the `Get` operation from the list of Secret permissions
![Create Key Vault](../../assets/images/APIMSecurityKV2.jpg)
![Create Key Vault](../../assets/images/apim-security-key-vault-2.jpg)
Select the principal and search for the name of your API Management instance
![Create Key Vault](../../assets/images/APIMSecurityKV3.jpg)
![Create Key Vault](../../assets/images/apim-security-key-vault-3.jpg)
![Create Key Vault](../../assets/images/APIMSecurityKV4.jpg)
![Create Key Vault](../../assets/images/apim-security-key-vault-4.jpg)
Remember to click **Save**
![Create Key Vault](../../assets/images/APIMSecurityKV5.jpg)
![Create Key Vault](../../assets/images/apim-security-key-vault-5.jpg)
#### API Management, Key Vault and Managed Service Identity
- Add a new operation to the Star Wars API
- Update the policies for the new operation
![New operation](../../assets/images/APIMSecurityAddOperation.png)
![New operation](../../assets/images/apim-security-add-operation.png)
```xml
<!-- Inbound -->

Просмотреть файл

@ -12,7 +12,7 @@ Based on the Microsoft Tech Community [blog post](https://techcommunity.microsof
The API Management is a proxy to the backend APIs, its a good practice to implement security mechanism to provide an extra layer of security to avoid unauthorized access to APIs.
![Diagram showing APIM and OAuth 2.0](../../assets/images/oauth2APIM1.png)
![Diagram showing APIM and OAuth 2.0](../../assets/images/oauth2-apim.png)
In this Diagram we can see the OAUTH flow with API Management in which:

Просмотреть файл

@ -71,17 +71,17 @@ Every client application that calls the API needs to be registered as an applica
- Then choose `My APIs`
- Select the record for `backend-app-oauth`
![client app registration5.1](../../assets/images/apimOauthgrants1.png)
![client app registration5.1](../../assets/images/apim-oauth-grants-1.png)
- Then select the `Delegated Permissions` option
- Then mark the `Calculator.Read` checkbox
- Then click the `Add Permissions` button
![client app registration5.2](../../assets/images/apimOauthgrants2.png)
![client app registration5.2](../../assets/images/apim-oauth-grants-2.png)
- Finally click the `Grant admin consent for ...`
![client app registration5.3](../../assets/images/apimOauthgrants3.png)
![client app registration5.3](../../assets/images/apim-oauth-grants-3.png)
### Enable OAuth 2.0 in the Developer Console for Authorization Code Grant type

Просмотреть файл

@ -32,7 +32,7 @@ Optional(if you want to deploy with a build pipeline):
## Architecture
![](../../assets/images/Architecture.png)
![](../../assets/images/apim-devops-architecture.png)
This is one example of how to use Azure DevOps Repo and Azure DevOps Pipelines to enable a Continuous Integration and Continuous Deployment (CI/CD) for API\'s on an Azure API Management Service. There're other ways to do this, but this is a \"Keep it Simple\" to help you start. (Planning to have another version using Github and Github Actions soon).
@ -121,7 +121,7 @@ You have two choices when specifying your settings:
After executing the command above, you will see something similar to this:
![](../../assets/images/extractor.png)
![](../../assets/images/apim-extractor.png)
Then you see the JSON files extracted:
@ -146,10 +146,10 @@ We will use a **Build Pipeline** to pull the extracted files from a repo and put
2 - Configure the fields as show bellow:
![A screenshot of a cell phone Description automatically
generated](../../assets/images/build-pipeline1.png)
generated](../../assets/images/ado-build-pipeline1.png)
![A screenshot of a cell phone Description automatically
generated](../../assets/images/build-pipeline2.png)
generated](../../assets/images/ado-build-pipeline2.png)
# Release Pipeline
@ -169,19 +169,19 @@ You can use [this](https://docs.microsoft.com/en-us/azure/devops/pipelines/relea
3 - Set set [Deployment mode to Incremental](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/deployment-tutorial-pipeline#create-a-devops-project)
![](../../assets/images/release-qa-parameters.png)
![](../../assets/images/ado-release-qa-parameters.png)
When you finish the steps above, you will see something like this:
![](../../assets/images/deploy-qa.png)
![](../../assets/images/ado-deploy-qa.png)
Clone your QA environment and update the **Resource Group** and **ApimServiceName** value on "Override template parameters" field to reflect your "production" APIM.
![](../../assets/images/release-prod.png)
![](../../assets/images/ado-release-prod.png)
Now you will see your Release Pipeline like this:
![](../../assets/images/release-pipeline.png)
![](../../assets/images/ado-release-pipeline.png)
By using a combination of manual deployment approvals, gates, and manual intervention within a release pipeline in Azure Pipelines, you can quickly and easily configure a release pipeline with all the control and auditing capabilities you require for your DevOps CI/CD processes. You will find more information on this [link](https://docs.microsoft.com/en-us/azure/devops/pipelines/release/deploy-using-approvals?view=azure-devops).

Двоичные данные
assets/images/APIMAddAPIs.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 77 KiB

Двоичные данные
assets/images/APIMAddColorAPI3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 80 KiB

Двоичные данные
assets/images/APIMAddColorAPI4.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 126 KiB

Двоичные данные
assets/images/APIMAddSWGetPeople.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 85 KiB

Двоичные данные
assets/images/APIMAddSWGetPeopleById.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 84 KiB

Двоичные данные
assets/images/APIMAddStarWars.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 84 KiB

Двоичные данные
assets/images/APIMCORS2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 111 KiB

Двоичные данные
assets/images/APIMCORS3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 92 KiB

Двоичные данные
assets/images/APIMCORS4.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 115 KiB

Двоичные данные
assets/images/APIMCalcTryIt2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 87 KiB

Двоичные данные
assets/images/APIMCertBlade.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 55 KiB

Двоичные данные
assets/images/APIMColorWebConfig.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 12 KiB

Двоичные данные
assets/images/APIMDevKeys2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 64 KiB

Двоичные данные
assets/images/APIMDevSubscribe2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 48 KiB

Двоичные данные
assets/images/APIMDevTryAPI3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 84 KiB

Двоичные данные
assets/images/APIMDeveloperPortal.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 228 KiB

Двоичные данные
assets/images/APIMFederatationGetAppID.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 131 KiB

Двоичные данные
assets/images/APIMFederationAuthentication.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 117 KiB

Двоичные данные
assets/images/APIMFederationAzureAD.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 95 KiB

Двоичные данные
assets/images/APIMFederationAzureAD2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 96 KiB

Двоичные данные
assets/images/APIMFederationAzureAD3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 79 KiB

Двоичные данные
assets/images/APIMFederationCreateApp.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 80 KiB

Двоичные данные
assets/images/APIMFederationCreateApp2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 74 KiB

Двоичные данные
assets/images/APIMFederationCreateKey.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 91 KiB

Двоичные данные
assets/images/APIMFederationCreateKey2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 97 KiB

Двоичные данные
assets/images/APIMFederationSignup.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 31 KiB

Двоичные данные
assets/images/APIMFederationSignup2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 59 KiB

Двоичные данные
assets/images/APIMFederationSignup3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 28 KiB

Двоичные данные
assets/images/APIMFederationSignup4.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 38 KiB

Двоичные данные
assets/images/APIMGitClone.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
assets/images/APIMGitClone2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
assets/images/APIMGitClone3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 27 KiB

Двоичные данные
assets/images/APIMGitDeploy.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 86 KiB

Двоичные данные
assets/images/APIMGitEditContent.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 6.8 KiB

Двоичные данные
assets/images/APIMGitProductUpdates.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 39 KiB

Двоичные данные
assets/images/APIMGitPush.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 22 KiB

Двоичные данные
assets/images/APIMGroupsBlade.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 72 KiB

Двоичные данные
assets/images/APIMIdentitiesBlade.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 86 KiB

Двоичные данные
assets/images/APIMListAPIs.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 93 KiB

Двоичные данные
assets/images/APIMManagementAPIBlade.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 128 KiB

Двоичные данные
assets/images/APIMMockingFrontend2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 120 KiB

Двоичные данные
assets/images/APIMMockingFrontend3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 123 KiB

Двоичные данные
assets/images/APIMMockingInbound2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 128 KiB

Двоичные данные
assets/images/APIMMockingInbound3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 110 KiB

Двоичные данные
assets/images/APIMOAuthBlade.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 55 KiB

Двоичные данные
assets/images/APIMOverviewBlade.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 102 KiB

Двоичные данные
assets/images/APIMProductStarter.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 53 KiB

Двоичные данные
assets/images/APIMProductStarterPolicy.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 101 KiB

Двоичные данные
assets/images/APIMRepositoryBlade.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 85 KiB

Двоичные данные
assets/images/APIMRepositoryPWBlade.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 85 KiB

Двоичные данные
assets/images/APIMResponseDeleteHeaders2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 118 KiB

Двоичные данные
assets/images/APIMRevisionsAdd.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 29 KiB

Двоичные данные
assets/images/APIMSWCORS1.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 90 KiB

Двоичные данные
assets/images/APIMScale.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 64 KiB

Двоичные данные
assets/images/APIMSecurityRegisterPrincipal.jpg

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 49 KiB

Двоичные данные
assets/images/APIMTraceJWTClaimBackend.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 31 KiB

Двоичные данные
assets/images/APIMTraceNV.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 171 KiB

Двоичные данные
assets/images/APIMTraceNV2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 115 KiB

Двоичные данные
assets/images/APIMTraceNV3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 29 KiB

Двоичные данные
assets/images/APIMUserActivateSub.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 102 KiB

Двоичные данные
assets/images/APIMUserActivateSub2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 95 KiB

Двоичные данные
assets/images/APIMUsersBlade.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 72 KiB

Двоичные данные
assets/images/APIMVNet.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 69 KiB

Двоичные данные
assets/images/APIManagement.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 188 KiB

Двоичные данные
assets/images/Architecture.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 136 KiB

Двоичные данные
assets/images/add-user-in-users-all-users.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 99 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 30 KiB

После

Ширина:  |  Высота:  |  Размер: 30 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 40 KiB

После

Ширина:  |  Высота:  |  Размер: 40 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 62 KiB

После

Ширина:  |  Высота:  |  Размер: 62 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 30 KiB

После

Ширина:  |  Высота:  |  Размер: 30 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 71 KiB

После

Ширина:  |  Высота:  |  Размер: 71 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 28 KiB

После

Ширина:  |  Высота:  |  Размер: 28 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 136 KiB

После

Ширина:  |  Высота:  |  Размер: 136 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 73 KiB

После

Ширина:  |  Высота:  |  Размер: 73 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 242 KiB

После

Ширина:  |  Высота:  |  Размер: 242 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 177 KiB

После

Ширина:  |  Высота:  |  Размер: 177 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 204 KiB

После

Ширина:  |  Высота:  |  Размер: 204 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 207 KiB

После

Ширина:  |  Высота:  |  Размер: 207 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 190 KiB

После

Ширина:  |  Высота:  |  Размер: 190 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 267 KiB

После

Ширина:  |  Высота:  |  Размер: 267 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 236 KiB

После

Ширина:  |  Высота:  |  Размер: 236 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 66 KiB

После

Ширина:  |  Высота:  |  Размер: 66 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 130 KiB

После

Ширина:  |  Высота:  |  Размер: 130 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 99 KiB

После

Ширина:  |  Высота:  |  Размер: 99 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 246 KiB

После

Ширина:  |  Высота:  |  Размер: 246 KiB

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше