Updates from: 05/16/2022 01:05:21
Service Microsoft Docs article Related commit history on GitHub Change details
active-directory Developer Guide Conditional Access Authentication Context https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/developer-guide-conditional-access-authentication-context.md
-# DevelopersΓÇÖ guide to Conditional Access authentication context
+# Developer guide to Conditional Access authentication context
-[Conditional Access](../conditional-access/overview.md) is the Zero Trust control plane that allows you to target policies for access to all your apps ΓÇô old or new, private, or public, on-premises, or multi-cloud. With [Conditional Access authentication context](../conditional-access/concept-conditional-access-cloud-apps.md#authentication-context-preview), you can apply different policies within those apps.
+[Conditional Access](../conditional-access/overview.md) is the Zero Trust control plane that allows you to target policies for access to all your apps ΓÇô old or new, private, or public, on-premises, or multi-cloud. With [Conditional Access authentication context](../conditional-access/concept-conditional-access-cloud-apps.md#authentication-context-preview), you can apply different policies within those apps.
Conditional Access authentication context (auth context) allows you to apply granular policies to sensitive data and actions instead of just at the app level. You can refine your Zero Trust policies for least privileged access while minimizing user friction and keeping users more productive and your resources more secure. Today, it can be used by applications using [OpenId Connect](https://openid.net/specs/openid-connect-core-1_0.html) for authentication developed by your company to protect sensitive resources, like high-value transactions or viewing employee personal data.
-Use the Azure AD Conditional access engineΓÇÖs new auth context feature to trigger a demand for step-up authentication from within your application and services. Developers now have the power to demand enhanced stronger authentication, selectively, like MFA from their end users from within their applications. This feature helps developers build smoother user experiences for most parts of their application, while access to more secure operations and data remains behind stronger authentication controls.
+Use the Azure AD Conditional Access engine's new auth context feature to trigger a demand for step-up authentication from within your application and services. Developers now have the power to demand enhanced stronger authentication, selectively, like MFA from their end users from within their applications. This feature helps developers build smoother user experiences for most parts of their application, while access to more secure operations and data remains behind stronger authentication controls.
## Problem statement
-The IT administrators and regulators often struggle between balancing prompting their users with additional factors of authentication too frequently and achieving adequate security and policy adherence for applications and services where parts of them contain sensitive data and operations. It can be a choice between a strong policy that impacts users' productivity when they access most data and actions or a policy that is not strong enough for sensitive resources.
+The IT administrators and regulators often struggle between balancing prompting their users with additional factors of authentication too frequently and achieving adequate security and policy adherence for applications and services where parts of them contain sensitive data and operations. It can be a choice between a strong policy that impacts users' productivity when they access most data and actions or a policy that is not strong enough for sensitive resources.
-So, what if apps were able to mix both, where they can function with a relatively lesser security and less frequent prompts for most users and operations and yet conditionally stepping up the security requirement when the users accessed more sensitive parts?
+So, what if apps were able to mix both, where they can function with a relatively lesser security and less frequent prompts for most users and operations and yet conditionally stepping up the security requirement when the users accessed more sensitive parts?
## Common scenarios
-For example, while users may sign in to SharePoint using multi-factor authentication, accessing site collection in SharePoint containing sensitive documents can require a compliant device and only be accessible from trusted IP ranges.
+For example, while users may sign in to SharePoint using multi-factor authentication, accessing site collection in SharePoint containing sensitive documents can require a compliant device and only be accessible from trusted IP ranges.
-## Steps
-
-The following are the prerequisites and the steps if you want to use Conditional Access authentication context.
-
-### Prerequisites
+## Prerequisites
**First**, your app should be integrated with the Microsoft Identity Platform using the use [OpenID Connect](v2-protocols-oidc.md)/ [OAuth 2.0](v2-oauth2-auth-code-flow.md) protocols for authentication and authorization. We recommend you use [Microsoft identity platform authentication libraries](reference-v2-libraries.md) to integrate and secure your application with Azure Active Directory. [Microsoft identity platform documentation](index.yml) is a good place to start learning how to integrate your apps with the Microsoft Identity Platform. Conditional Access Auth Context feature support is built on top of protocol extensions provided by the industry standard [OpenID Connect](v2-protocols-oidc.md) protocol. Developers use a [Conditional Access Auth Context reference](/graph/api/conditionalaccessroot-list-authenticationcontextclassreferences) **value** with the [Claims Request](claims-challenge.md) parameter to give apps a way to trigger and satisfy policy.
The following are the prerequisites and the steps if you want to use Conditional
**Third**, today it is only available to applications that sign-in users. Applications that authenticate as themselves are not supported. Use the [Authentication flows and application scenarios guide](authentication-flows-app-scenarios.md) to learn about the supported authentication app types and flows in the Microsoft Identity Platform.
-### Integration steps
+## Integration steps
Once your application is integrated using the supported authentication protocols and registered in an Azure AD tenant that has the Conditional Access feature available for use, you can kick start the process to integrating this feature in your applications that sign-in users.
Create or modify your Conditional Access policies to use the Conditional Access
- All users signing into this web application should have successfully completed 2FA and also access the web app from a certain IP address range for auth context ID **C3**. > [!NOTE]
-> The Conditional Access auth context values are declared and maintained separately from applications. It is not advisable for applications to take hard dependency on auth context ids. The Conditional Access policies are usually crafted by IT administrators as they have a better understanding of the resources available to apply policies on. For example, for an Azure AD tenant, IT admins would have the knowledge of how many of the tenantΓÇÖs users are equipped to use 2FA for MFA and thus can ensure that Conditional Access policies that require 2FA are scoped to these equipped users.
+> The Conditional Access auth context values are declared and maintained separately from applications. It is not advisable for applications to take hard dependency on auth context ids. The Conditional Access policies are usually crafted by IT administrators as they have a better understanding of the resources available to apply policies on. For example, for an Azure AD tenant, IT admins would have the knowledge of how many of the tenant's users are equipped to use 2FA for MFA and thus can ensure that Conditional Access policies that require 2FA are scoped to these equipped users.
> Similarly, if the application is used in multiple tenants, the auth context ids in use could be different and, in some cases, not available at all. **Second**: The developers of an application planning to use Conditional Access auth context are advised to first provide the application admins or IT admins a means to map potential sensitive actions to auth context IDs. The steps roughly being:
Create or modify your Conditional Access policies to use the Conditional Access
These steps are the changes that you need to carry in your code base. The steps broadly comprise of - Query MS Graph to [list all the available Auth Contexts](/graph/api/conditionalaccessroot-list-authenticationcontextclassreferences).-- Allow IT admins to select sensitive/ high-privileged operations and assign them against the available Auth Contexts using CA policies.
+- Allow IT admins to select sensitive/ high-privileged operations and assign them against the available Auth Contexts using CA policies.
- Save this mapping information in your database/local store. :::image type="content" source="media/developer-guide-conditional-access-authentication-context/configure-conditional-access-authentication-context.png" alt-text="Setup flow for creating an authentication context":::
-**Third**: Your application, and for this example, weΓÇÖd assume itΓÇÖs a web API, then needs to evaluate calls against the saved mapping and accordingly raise claim challenges for its client apps. To prepare for this action, the following steps are to be taken:
+**Third**: Your application, and for this example, we'd assume it's a web API, then needs to evaluate calls against the saved mapping and accordingly raise claim challenges for its client apps. To prepare for this action, the following steps are to be taken:
-1. In a sensitive and protected by auth context operation, evaluate the values in the **acrs** claim against the Auth Context ID mappings saved earlier and raise a [Claims Challenge](claims-challenge.md) as provided in the code snippet below.
+1. In a sensitive and protected by auth context operation, evaluate the values in the **acrs** claim against the Auth Context ID mappings saved earlier and raise a [Claims Challenge](claims-challenge.md) as provided in the code snippet below.
1. The following diagram shows the interaction between the user, client app, and the web API. :::image type="content" source="media/developer-guide-conditional-access-authentication-context/authentication-context-application-flow.png" alt-text="Diagram showing the interaction of user, web app, API, and Azure AD":::
- The code snippet that follows is from the code sample, [Use the Conditional Access auth context to perform step-up authentication](https://github.com/Azure-Samples/ms-identity-ca-auth-context/blob/main/README.md). The first method, `CheckForRequiredAuthContext()` in the API
+ The code snippet that follows is from the code sample, [Use the Conditional Access auth context to perform step-up authentication](https://github.com/Azure-Samples/ms-identity-ca-auth-context/blob/main/README.md). The first method, `CheckForRequiredAuthContext()` in the API
- Checks if the application's action being called requires step-up authentication. It does so by checking its database for a saved mapping for this method - If this action indeed requires an elevated auth context, it checks the **acrs** claim for an existing, matching Auth Context ID. - If a matching Auth Context ID is not found, it raises a [claims challenge](claims-challenge.md#claims-challenge-header-format).
- ```
+ ```csharp
public void CheckForRequiredAuthContext(string method) {
- string authType = _commonDBContext.AuthContext.FirstOrDefault(x => x.Operation == method
+ string authType = _commonDBContext.AuthContext.FirstOrDefault(x => x.Operation == method
&& x.TenantId == _configuration["AzureAD:TenantId"])?.AuthContextId; if (!string.IsNullOrEmpty(authType))
These steps are the changes that you need to carry in your code base. The steps
HttpContext context = this.HttpContext; string authenticationContextClassReferencesClaim = "acrs";
- if (context == null || context.User == null || context.User.Claims == null
+ if (context == null || context.User == null || context.User.Claims == null
|| !context.User.Claims.Any()) { throw new ArgumentNullException("No Usercontext is available to pick claims from"); }
- Claim acrsClaim = context.User.FindAll(authenticationContextClassReferencesClaim).FirstOrDefault(x
+ Claim acrsClaim = context.User.FindAll(authenticationContextClassReferencesClaim).FirstOrDefault(x
=> x.Value == authType); if (acrsClaim == null || acrsClaim.Value != authType)
These steps are the changes that you need to carry in your code base. The steps
``` > [!NOTE]
- > The format of the claims challenge is described in the article, [Claims Challenge in the Microsoft Identity Platform](claims-challenge.md).
+ > The format of the claims challenge is described in the article, [Claims Challenge in the Microsoft Identity Platform](claims-challenge.md).
1. In the client application, Intercept the claims challenge and redirect the user back to Azure AD for further policy evaluation. The code snippet that follows is from the code sample, [Use the Conditional Access auth context to perform step-up authentication](https://github.com/Azure-Samples/ms-identity-ca-auth-context/blob/main/README.md).
- ```
+ ```csharp
internal static string ExtractHeaderValues(WebApiMsalUiRequiredException response) { if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized && response.Headers.WwwAuthenticate.Any())
These steps are the changes that you need to carry in your code base. The steps
Handle exception in the call to Web API, if a claims challenge is presented, the redirect the user back to Azure AD for further processing.
- ```
+ ```csharp
try {
- // Call the API
+ // Call the API
await _todoListService.AddAsync(todo); } catch (WebApiMsalUiRequiredException hex)
These steps are the changes that you need to carry in your code base. The steps
} return RedirectToAction("Index"); ```
-
+ 1. (Optional) Declare client capability. Client capabilities help resources providers (RP) like our Web API above to detect if the calling client application understands the claims challenge and can then customize its response accordingly. This capability could be useful where not all of the APIs clients are capable of handling claim challenges and some older ones still expect a different response. For more information, see the section [Client capabilities](claims-challenge.md#client-capabilities). ## Caveats and recommendations
-Do not hard-code Auth Context values in your app. Apps should read and apply auth context [using MS Graph calls](/graph/api/resources/authenticationcontextclassreference). This practice is critical for [multi-tenant applications](howto-convert-app-to-be-multi-tenant.md). The Auth Context values will vary between Azure AD tenants will not available in Azure AD free edition. For more information on how an app should query, set, and use auth context in their code, see the code sample, [Use the Conditional Access auth context to perform step-up authentication](https://github.com/Azure-Samples/ms-identity-ca-auth-context/blob/main/README.md) as how an app should query, set and use auth context in their code.
+Do not hard-code Auth Context values in your app. Apps should read and apply auth context [using MS Graph calls](/graph/api/resources/authenticationcontextclassreference). This practice is critical for [multi-tenant applications](howto-convert-app-to-be-multi-tenant.md). The Auth Context values will vary between Azure AD tenants will not available in Azure AD free edition. For more information on how an app should query, set, and use auth context in their code, see the code sample, [Use the Conditional Access auth context to perform step-up authentication](https://github.com/Azure-Samples/ms-identity-ca-auth-context/blob/main/README.md) as how an app should query, set and use auth context in their code.
Do not use auth context where the app itself is going to be a target of Conditional Access policies. The feature works best when parts of the application require the user to meet a higher bar of authentication.
+## Code samples
+
+- [Use the Conditional Access auth context to perform step-up authentication for high-privilege operations in a web app](https://github.com/Azure-Samples/ms-identity-dotnetcore-ca-auth-context-app/blob/main/README.md)
+- [Use the Conditional Access auth context to perform step-up authentication for high-privilege operations in a web API](https://github.com/Azure-Samples/ms-identity-ca-auth-context/blob/main/README.md)
+ ## Next steps - [Granular Conditional Access for sensitive data and actions (Blog)](https://techcommunity.microsoft.com/t5/azure-active-directory-identity/granular-conditional-access-for-sensitive-data-and-actions/ba-p/1751775) - [Zero trust with the Microsoft Identity platform](/security/zero-trust/identity-developer) - [Building Zero Trust ready apps with the Microsoft identity platform](/security/zero-trust/identity-developer)-- [Use the Conditional Access auth context to perform step\-up authentication for high\-privilege operations in a Web app](https://github.com/Azure-Samples/ms-identity-dotnetcore-ca-auth-context-app/blob/main/README.md)-- [Use the Conditional Access auth context to perform step-up authentication for high-privilege operations in a Web API](https://github.com/Azure-Samples/ms-identity-ca-auth-context/blob/main/README.md) - [Conditional Access authentication context](../conditional-access/concept-conditional-access-cloud-apps.md#authentication-context-preview) - [authenticationContextClassReference resource type - MS Graph](/graph/api/conditionalaccessroot-list-authenticationcontextclassreferences)-- [Claims challenge, claims request, and client capabilities in the Microsoft Identity Platform](claims-challenge.md)
+- [Claims challenge, claims request, and client capabilities in the Microsoft identity platform](claims-challenge.md)
- [Using authentication context with Microsoft Information Protection and SharePoint](/microsoft-365/compliance/sensitivity-labels-teams-groups-sites#more-information-about-the-dependencies-for-the-authentication-context-option)-- [Authentication flows and application scenarios](authentication-flows-app-scenarios.md) - [How to use Continuous Access Evaluation enabled APIs in your applications](app-resilience-continuous-access-evaluation.md)
active-directory Msal Android Single Sign On https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/msal-android-single-sign-on.md
There are two ways for applications using MSAL for Android to achieve SSO:
We recommend that you use one of Microsoft's authentication brokers to participate in device-wide single sign-on (SSO) and to meet organizational Conditional Access policies. Integrating with a broker provides the following benefits: - Device single sign-on-- Conditional access for:
+- Conditional Access for:
- Intune App Protection - Device Registration (Workplace Join) - Mobile Device Management
active-directory Msal Differences Ios Macos https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/msal-differences-ios-macos.md
MSAL for macOS doesn't support:
Keychain sharing between apps from the same publisher is more limited on macOS 10.14 and earlier. Use [access control lists](https://developer.apple.com/documentation/security/keychain_services/access_control_lists?language=objc) to specify the paths to the apps that should share the keychain. User may see additional keychain prompts.
-On macOS 10.15+, MSAL's behavior is the same between iOS and macOS. MSAL uses [keychain access groups](https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps?language=objc) for keychain sharing.
+On macOS 10.15+, MSAL's behavior is the same between iOS and macOS. MSAL uses [keychain access groups](https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps?language=objc) for keychain sharing.
-### Conditional access authentication differences
+### Conditional Access authentication differences
For Conditional Access scenarios, there will be fewer user prompts when you use MSAL for iOS. This is because iOS uses the broker app (Microsoft Authenticator) which negates the need to prompt the user in some cases.
For Conditional Access scenarios, there will be fewer user prompts when you use
- When you set up your project on macOS, ensure that your application is signed with a valid development or production certificate. MSAL still works in the unsigned mode, but it will behave differently with regards to cache persistence. The app should only be run unsigned for debugging purposes. If you distribute the app unsigned, it will: 1. On 10.14 and earlier, MSAL will prompt the user for a keychain password every time they restart the app.
-2. On 10.15+, MSAL will prompt user for credentials for every token acquisition.
+2. On 10.15+, MSAL will prompt user for credentials for every token acquisition.
- macOS apps don't need to implement the AppDelegate call.
active-directory Reference Breaking Changes https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/reference-breaking-changes.md
Title: Azure Active Directory breaking changes reference
-description: Learn about changes made to the Azure AD protocols that may impact your application.
+ Title: Updates and breaking changes
+description: Learn about changes to the Microsoft identity platform that can impact your application.
- Previously updated : 11/24/2021 Last updated : 05/12/2022 -+ # What's new for authentication?
-> Get notified of updates to this page by pasting this URL into your RSS feed reader:<br/>`https://docs.microsoft.com/api/search/rss?search=%22Azure+Active+Directory+breaking+changes+reference%22&locale=en-us`
+Microsoft periodically adds and modifies the features and functionality of the Microsoft identity platform to improve its security, usability, and standards compliance.
-The authentication system alters and adds features on an ongoing basis to improve security and standards compliance. To stay up to date with the most recent developments, this article provides you with information about the following details:
+Unless otherwise noted, the changes described here apply only to applications registered after the stated effective date of the change.
-- Latest features-- Known issues
+Check this article regularly to learn about:
+
+- Known issues and fixes
- Protocol changes - Deprecated functionality > [!TIP]
-> This page is updated regularly, so visit often. Unless otherwise noted, these changes are only put in place for newly registered applications.
+> To be notified of updates to this page, add this URL to your RSS feed reader:<br/>`https://docs.microsoft.com/api/search/rss?search=%22Azure+Active+Directory+breaking+changes+reference%22&locale=en-us`
-## Upcoming changes
+## December 2021
-### ADFS users will see additional login prompts to ensure that the correct user is signed in.
+### AD FS users will see more login prompts to ensure that the correct user is signed in.
**Effective date**: December 2021
The authentication system alters and adds features on an ongoing basis to improv
**Change**
-Today, when a user is sent to ADFS to authenticate, they will be silently signed into any account that already has a session with ADFS. This silent sign-in occurs even if the user intended to sign into a different user account. To reduce the frequency of this incorrect sign in occurring, starting in December Azure AD will send the `prompt=login` parameter to ADFS if the Web Account Manager in Windows provides Azure AD a `login_hint` during sign-in, which indicates a specific user is desired for sign-in.
+Today, when a user is sent to AD FS to authenticate, they'll be silently signed into any account that already has a session with AD FS. The silent sign-in occurs even if the user intended to sign into a different user account. To reduce the frequency of this incorrect sign-in occurring, starting in December Azure AD will send the `prompt=login` parameter to AD FS if the Web Account Manager in Windows provides Azure AD a `login_hint` during sign-in, which indicates a specific user is desired for sign-in.
-When the above requirements are met (WAM is used to send the user to Azure AD to sign in, a `login_hint` is included, and the [ADFS instance for the user's domain supports `prompt=login`](/windows-server/identity/ad-fs/operations/ad-fs-prompt-login)) the user will not be silently signed in, and instead asked to provide a username to continue signing into ADFS. If they wish to sign into their existing ADFS session, they can select the "Continue as current user" option displayed below the login prompt. Otherwise, they can continue with the username that they intend to sign in with.
+When the above requirements are met (WAM is used to send the user to Azure AD to sign in, a `login_hint` is included, and the [AD FS instance for the user's domain supports `prompt=login`](/windows-server/identity/ad-fs/operations/ad-fs-prompt-login)) the user won't be silently signed in, and instead asked to provide a username to continue signing into AD FS. If they wish to sign into their existing AD FS session, they can select the "Continue as current user" option displayed below the login prompt. Otherwise, they can continue with the username that they intend to sign in with.
-This change will be rolled out in December 2021 over the course of several weeks. It does not change sign in behavior for:
+This change will be rolled out in December 2021 over the course of several weeks. It doesn't change sign in behavior for:
* Applications that use IWA directly * Applications using OAuth
-* Domains that are not federated to an ADFS instance
+* Domains that aren't federated to an AD FS instance
## October 2021
This change will be rolled out in December 2021 over the course of several weeks
**Change**
-Error 50105 (the current designation) is emitted when an unassigned user attempts to sign into an app that an admin has marked as requiring user assignment. This is a common access control pattern, and users must often find an admin to request assignment to unblock access. The error had a bug that would cause infinite loops in well-coded applications that correctly handled the `interaction_required` error response. `interaction_required` tells an app to perform interactive authentication, but even after doing so Azure AD would still return an `interaction_required` error response.
+Error 50105 (the current designation) is emitted when an unassigned user attempts to sign into an app that an admin has marked as requiring user assignment. This is a common access control pattern, and users must often find an admin to request assignment to unblock access. The error had a bug that would cause infinite loops in well-coded applications that correctly handled the `interaction_required` error response. `interaction_required` tells an app to perform interactive authentication, but even after doing so Azure AD would still return an `interaction_required` error response.
-The error scenario has been updated, so that during non-interactive authentication (where `prompt=none` is used to hide UX), the app will be instructed to perform interactive authentication using an `interaction_required` error response. In the subsequent interactive authentication, Azure AD will now hold the user and show an error message directly, preventing a loop from occurring.
+The error scenario has been updated, so that during non-interactive authentication (where `prompt=none` is used to hide UX), the app will be instructed to perform interactive authentication using an `interaction_required` error response. In the subsequent interactive authentication, Azure AD will now hold the user and show an error message directly, preventing a loop from occurring.
-As a reminder, Azure AD does not support applications detecting individual error codes, such as checking strings for `AADSTS50105`. Instead, [Azure AD guidance](reference-aadsts-error-codes.md#handling-error-codes-in-your-application) is to follow the standards and use the [standardized authentication responses](https://openid.net/specs/openid-connect-core-1_0.html#AuthError) such as `interaction_required` and `login_required`. These are found in the standard `error` field in the response - the other fields are for human consumption during troubleshooting.
+As a reminder, your application code shouldn't make decisions based on error code strings like `AADSTS50105`. Instead, [follow our error-handling guidance](reference-aadsts-error-codes.md#handling-error-codes-in-your-application) and use the [standardized authentication responses](https://openid.net/specs/openid-connect-core-1_0.html#AuthError) like `interaction_required` and `login_required` found in the standard `error` field in the response. The other response fields are intended for consumption only by humans troubleshooting their issues.
-You can review the current text of the 50105 error and more on the error lookup service: https://login.microsoftonline.com/error?code=50105 .
+You can review the current text of the 50105 error and more on the error lookup service: https://login.microsoftonline.com/error?code=50105.
### AppId Uri in single tenant applications will require use of default scheme or verified domains
You can review the current text of the 50105 error and more on the error lookup
**Change**
-For single tenant applications, adding or updating the AppId URI validates that the domain in the HTTPS scheme URI is listed in the verified domain list in the customer tenant or that the value uses the default scheme (`api://{appId}`) provided by Azure AD. This could prevent applications from adding an AppId URI if the domain isn't in the verified domain list or the value does not use the default scheme.
+For single tenant applications, adding or updating the AppId URI validates that the domain in the HTTPS scheme URI is listed in the verified domain list in the customer tenant or that the value uses the default scheme (`api://{appId}`) provided by Azure AD. This could prevent applications from adding an AppId URI if the domain isn't in the verified domain list or the value doesn't use the default scheme.
To find more information on verified domains, refer to the [custom domains documentation](../../active-directory/fundamentals/add-custom-domain.md).
-The change does not affect existing applications using unverified domains in their AppID URI. It validates only new applications or when an existing application updates an identifier URIs or adds a new one to the identifierUri collection. The new restrictions apply only to URIs added to an app's identifierUris collection after 10/15/2021. AppId URIs already in an application's identifierUris collection when the restriction takes affect on 10/15/2021 will continue to function even if you add new URIs to that collection.
+The change doesn't affect existing applications using unverified domains in their AppID URI. It validates only new applications or when an existing application updates an identifier URI or adds a new one to the identifierUri collection. The new restrictions apply only to URIs added to an app's identifierUris collection after October 15, 2021. AppId URIs already in an application's identifierUris collection when the restriction takes effect on October 15, 2021 will continue to function even if you add new URIs to that collection.
If a request fails the validation check, the application API for create/update will return a `400 badrequest` to the client indicating HostNameNotOnVerifiedDomain.
If a request fails the validation check, the application API for create/update w
### Conditional Access will only trigger for explicitly requested scopes
-**Effective date**: August 2021, with gradual rollout starting in April.
+**Effective date**: August 2021, with gradual rollout starting in April.
**Endpoints impacted**: v2.0 **Protocol impacted**: All flows using [dynamic consent](v2-permissions-and-consent.md#requesting-individual-user-consent)
-Applications using dynamic consent today are given all of the permissions they have consent for, even if they were not requested in the `scope` parameter by name. This can cause an app requesting e.g. only `user.read`, but with consent to `files.read`, to be forced to pass the Conditional Access assigned for the `files.read` permission.
+Applications using dynamic consent today are given all the permissions they have consent for, even if they weren't requested by name in the `scope` parameter. An app requesting only `user.read` but with consent to `files.read` can be forced to pass the Conditional Access requirement assigned for `files.read`, for example.
-In order to reduce the number of unnecessary Conditional Access prompts, Azure AD is changing the way that unrequested scopes are provided to applications so that only explicitly requested scopes trigger Conditional Access. This change may cause apps reliant on Azure AD's previous behavior (namely, providing all permissions even when they were not requested) to break, as the tokens they request will be missing permissions.
+To reduce the number of unnecessary Conditional Access prompts, Azure AD is changing the way scopes are provided to applications so only explicitly requested scopes trigger Conditional Access. Applications relying on Azure AD's previous behavior of including _all_ scopes in the token--whether requested or not--may break due to missing scopes.
-Apps will now receive access tokens with a mix of permissions in this - those requested, as well as those they have consent for that do not require Conditional Access prompts. The scopes of the access token is reflected in the token response's `scope` parameter.
+Apps will now receive access tokens with a mix of permissions: requested tokens and those they have consent for that don't require Conditional Access prompts. The scope of access for the token is reflected in the token response's `scope` parameter.
-This change will be made for all apps except those with an observed dependency on this behavior. Developers will receive outreach if they are exempted from this change, as them may have a dependency on the additional conditional access prompts.
+This change will be made for all apps except those with an observed dependency on this behavior. Developers will receive outreach if they're exempted from this change, as them may have a dependency on the additional conditional access prompts.
**Examples**
-An app has consent for `user.read`, `files.readwrite`, and `tasks.read`. `files.readwrite` has Conditional Access policies applied to it, while the other two do not. If an app makes a token request for `scope=user.read`, and the currently signed in user has not passed any Conditional Access policies, then the resulting token will be for the `user.read` and `tasks.read` permissions. `tasks.read` is included because the app has consent for it, and it does not require a Conditional Access policy to be enforced.
+An app has consent for `user.read`, `files.readwrite`, and `tasks.read`. `files.readwrite` has Conditional Access policies applied to it, while the other two don't. If an app makes a token request for `scope=user.read`, and the currently signed in user hasn't passed any Conditional Access policies, then the resulting token will be for the `user.read` and `tasks.read` permissions. `tasks.read` is included because the app has consent for it, and it doesn't require a Conditional Access policy to be enforced.
-If the app then requests `scope=files.readwrite`, the Conditional Access required by the tenant will trigger, forcing the app to show an interactive auth prompt where the Conditional Access policy can be satisfied. The token returned will have all three scopes in it.
+If the app then requests `scope=files.readwrite`, the Conditional Access required by the tenant will trigger, forcing the app to show an interactive auth prompt where the Conditional Access policy can be satisfied. The token returned will have all three scopes in it.
-If the app then makes one last request for any of the three scopes (say, `scope=tasks.read`), Azure AD will see that the user has already completed the Conditional access policies needed for `files.readwrite`, and again issue a token with all three permissions in it.
+If the app then makes one last request for any of the three scopes (say, `scope=tasks.read`), Azure AD will see that the user has already completed the Conditional Access policies needed for `files.readwrite`, and again issue a token with all three permissions in it.
## June 2021
If the app then makes one last request for any of the three scopes (say, `scope=
**Protocol impacted**: The [device code flow](v2-oauth2-device-code.md)
-As a security improvement, the device code flow has been updated to add an additional prompt, which validates that the user is signing into the app they expect. This is added to help prevent phishing attacks.
+To help prevent phishing attacks, the device code flow now includes a prompt that validates the user is signing into the app they expect.
The prompt that appears looks like this:
The prompt that appears looks like this:
**Protocol impacted**: All flows that visit the `/authorize` endpoint (implicit flow and authorization code flow)
-A bug was found and fixed in the Azure AD authorization response. During the `/authorize` leg of authentication, the `state` parameter from the request is included in the response, in order to preserve app state and help prevent CSRF attacks. Azure AD incorrectly URL-encoded the `state` parameter before inserting it into the response, where it was encoded once more. This would result in applications incorrectly rejecting the response from Azure AD.
+A bug was found and fixed in the Azure AD authorization response. During the `/authorize` leg of authentication, the `state` parameter from the request is included in the response, to preserve app state and help prevent CSRF attacks. Azure AD incorrectly URL-encoded the `state` parameter before inserting it into the response, where it was encoded once more. This would result in applications incorrectly rejecting the response from Azure AD.
-Azure AD will no longer double-encode this parameter, allowing apps to correctly parse the result. This change will be made for all applications.
+Azure AD will no longer double-encode this parameter, allowing apps to correctly parse the result. This change will be made for all applications.
### Azure Government endpoints are changing
-**Effective date**: May 5th (Finishing June 2020)
+**Effective date**: May 5, 2020 (Finishing June 2020)
**Endpoints impacted**: All **Protocol impacted**: All flows
-On 1 June 2018, the official Azure Active Directory (Azure AD) Authority for Azure Government changed from `https://login-us.microsoftonline.com` to `https://login.microsoftonline.us`. This change also applied to Microsoft 365 GCC High and DoD, which Azure Government Azure AD also services. If you own an application within a US Government tenant, you must update your application to sign users in on the `.us` endpoint.
+On 1 June 2018, the official Azure Active Directory (Azure AD) Authority for Azure Government changed from `https://login-us.microsoftonline.com` to `https://login.microsoftonline.us`. This change also applied to Microsoft 365 GCC High and DoD, which Azure Government Azure AD also services. If you own an application within a US Government tenant, you must update your application to sign users in on the `.us` endpoint.
-Starting May 5th, Azure AD will begin enforcing the endpoint change, blocking government users from signing into apps hosted in US Government tenants using the public endpoint (`microsoftonline.com`). Impacted apps will begin seeing an error `AADSTS900439` - `USGClientNotSupportedOnPublicEndpoint`. This error indicates that the app is attempting to sign in a US Government user on the public cloud endpoint. If your app is in a public cloud tenant and intended to support US Government users, you will need to [update your app to support them explicitly](./authentication-national-cloud.md). This may require creating a new app registration in the US Government cloud.
+On May 5, 2020, Azure AD will begin enforcing the endpoint change, blocking government users from signing into apps hosted in US Government tenants using the public endpoint (`microsoftonline.com`). Impacted apps will begin seeing an error `AADSTS900439` - `USGClientNotSupportedOnPublicEndpoint`. This error indicates that the app is attempting to sign in a US Government user on the public cloud endpoint. If your app is in a public cloud tenant and intended to support US Government users, you'll need to [update your app to support them explicitly](./authentication-national-cloud.md). This may require creating a new app registration in the US Government cloud.
-Enforcement of this change will be done using a gradual rollout based on how frequently users from the US Government cloud sign in to the application - apps signing in US Government users infrequently will see enforcement first, and apps frequently used by US Government users will be last to have enforcement applied. We expect enforcement to be complete across all apps in June 2020.
+Enforcement of this change will be done using a gradual rollout based on how frequently users from the US Government cloud sign in to the application - apps signing in US Government users infrequently will see enforcement first, and apps frequently used by US Government users will be last to have enforcement applied. We expect enforcement to be complete across all apps in June 2020.
-For more details, please see the [Azure Government blog post on this migration](https://devblogs.microsoft.com/azuregov/azure-government-aad-authority-endpoint-update/).
+For more details, please see the [Azure Government blog post on this migration](https://devblogs.microsoft.com/azuregov/azure-government-aad-authority-endpoint-update/).
## March 2020
For more details, please see the [Azure Government blog post on this migration](
**Protocol impacted**: All user flows.
-Users with passwords longer than 256 characters that sign in directly to Azure AD (as opposed to a federated IDP like ADFS) will be unable to sign in starting March 13, 2020, and be asked to reset their password instead. Admins may receive requests to help reset the users password.
+Users with passwords longer than 256 characters who sign in directly to Azure AD (not a federated IDP, like AD FS) will be asked to change their passwords before they can sign in. Admins may receive requests to help reset the users password.
-The error in the sign in logs will be AADSTS 50052: InvalidPasswordExceedsMaxLength
+The error in the sign-in logs will be similar to _AADSTS 50052: InvalidPasswordExceedsMaxLength_.
Message: `The password entered exceeds the maximum length of 256. Please reach out to your admin to reset the password.` Remediation:
-The user is unable to login because their password exceeds the permitted maximum length. They should contact their admin to reset the password. If SSPR is enabled for their tenant, they can reset their password by following the "Forgot your password" link.
--
+The user is unable to log in because their password exceeds the permitted maximum length. They should contact their admin to reset the password. If SSPR is enabled for their tenant, they can reset their password by following the "Forgot your password" link.
## February 2020
The user is unable to login because their password exceeds the permitted maximum
**Endpoints impacted**: Both v1.0 and v2.0
-**Protocol impacted**: OAuth and OIDC flows that use response_type=query - this covers the [authorization code flow](v2-oauth2-auth-code-flow.md) in some cases, and the [implicit flow](v2-oauth2-implicit-grant-flow.md).
+**Protocol impacted**: OAuth and OIDC flows that use `response_type=query` - this covers the [authorization code flow](v2-oauth2-auth-code-flow.md) in some cases, and the [implicit flow](v2-oauth2-implicit-grant-flow.md).
-When an authentication response is sent from login.microsoftonline.com to an application via HTTP redirect, the service will append an empty fragment to the reply URL. This prevents a class of redirect attacks by ensuring that the browser wipes out any existing fragment in the authentication request. No apps should have a dependency on this behavior.
+When an authentication response is sent from _login.microsoftonline.com_ to an application via HTTP redirect, the service will append an empty fragment to the reply URL. This prevents a class of redirect attacks by ensuring that the browser wipes out any existing fragment in the authentication request. No apps should have a dependency on this behavior.
## August 2019
When an authentication response is sent from login.microsoftonline.com to an app
**Protocol impacted**: Anywhere POST is used ([client credentials](./v2-oauth2-client-creds-grant-flow.md), [authorization code redemption](./v2-oauth2-auth-code-flow.md), [ROPC](./v2-oauth-ropc.md), [OBO](./v2-oauth2-on-behalf-of-flow.md), and [refresh token redemption](./v2-oauth2-auth-code-flow.md#refresh-the-access-token))
-Starting the week of 9/2, authentication requests that use the POST method will be validated using stricter HTTP standards. Specifically, spaces and double-quotes (") will no longer be removed from request form values. These changes are not expected to break any existing clients, and will ensure that requests sent to Azure AD are reliably handled every time. In the future (see above) we plan to additionally reject duplicate parameters and ignore the BOM within requests.
+Beginning the week of September 2, 2019, authentication requests that use the POST method will be validated using stricter HTTP standards. Specifically, spaces and double-quotes (") will no longer be removed from request form values. These changes aren't expected to break any existing clients, and will ensure that requests sent to Azure AD are reliably handled every time. In the future (see above) we plan to additionally reject duplicate parameters and ignore the BOM within requests.
Example:
-Today, `?e= "f"&g=h` is parsed identically as `?e=f&g=h` - so `e` == `f`. With this change, it would now be parsed so that `e` == ` "f"` - this is unlikely to be a valid argument, and the request would now fail.
+Today, `?e= "f"&g=h` is parsed identically as `?e=f&g=h` - so `e` == `f`. With this change, it would now be parsed so that `e` == ` "f"` - this is unlikely to be a valid argument, and the request would now fail.
## July 2019
Today, `?e= "f"&g=h` is parsed identically as `?e=f&g=h` - so `e` == `f`. Wi
**Protocol impacted**: [Client Credentials (app-only tokens)](../azuread-dev/v1-oauth2-client-creds-grant-flow.md)
-A security change went live July 26th that changes the way app-only tokens (via the client credentials grant) are issued. Previously, applications were allowed to get tokens to call any other app, regardless of presence in the tenant or roles consented to for that application. This behavior has been updated so that for resources (sometimes called web APIs) set to be single-tenant (the default), the client application must exist within the resource tenant. Note that existing consent between the client and the API is still not required, and apps should still be doing their own authorization checks to ensure that a `roles` claim is present and contains the expected value for the API.
+A security change took effect on July 26, 2019 changing the way app-only tokens (via the client credentials grant) are issued. Previously, applications were allowed to get tokens to call any other app, regardless of presence in the tenant or roles consented to for that application. This behavior has been updated so that for resources (sometimes called web APIs) set to be single-tenant (the default), the client application must exist within the resource tenant. Existing consent between the client and the API is still not required, and apps should still be doing their own authorization checks to ensure that a `roles` claim is present and contains the expected value for the API.
The error message for this scenario currently states: `The service principal named <appName> was not found in the tenant named <tenant_name>. This can happen if the application has not been installed by the administrator of the tenant.`
-To remedy this issue, use the Admin Consent experience to create the client application service principal in your tenant, or create it manually. This requirement ensures that the tenant has given the application permission to operate within the tenant.
+To remedy this issue, use the Admin Consent experience to create the client application service principal in your tenant, or create it manually. This requirement ensures that the tenant has given the application permission to operate within the tenant.
#### Example request `https://login.microsoftonline.com/contoso.com/oauth2/authorize?resource=https://gateway.contoso.com/api&response_type=token&client_id=14c88eee-b3e2-4bb0-9233-f5e3053b3a28&...`
-In this example, the resource tenant (authority) is contoso.com, the resource app is a single-tenant app called `gateway.contoso.com/api` for the Contoso tenant, and the client app is `14c88eee-b3e2-4bb0-9233-f5e3053b3a28`. If the client app has a service principal within Contoso.com, this request can continue. If it doesn't, however, then the request will fail with the error above.
+In this example, the resource tenant (authority) is contoso.com, the resource app is a single-tenant app called `gateway.contoso.com/api` for the Contoso tenant, and the client app is `14c88eee-b3e2-4bb0-9233-f5e3053b3a28`. If the client app has a service principal within Contoso.com, this request can continue. If it doesn't, however, then the request will fail with the error above.
If the Contoso gateway app were a multi-tenant application, however, then the request would continue regardless of the client app having a service principal within Contoso.com.
If the Contoso gateway app were a multi-tenant application, however, then the re
**Protocol impacted**: All flows
-Per [RFC 6749](https://tools.ietf.org/html/rfc6749#section-3.1.2), Azure AD applications can now register and use redirect (reply) URIs with static query parameters (such as `https://contoso.com/oauth2?idp=microsoft`) for OAuth 2.0 requests. Dynamic redirect URIs are still forbidden as they represent a security risk, and this cannot be used to retain state information across an authentication request - for that, use the `state` parameter.
+Per [RFC 6749](https://tools.ietf.org/html/rfc6749#section-3.1.2), Azure AD applications can now register and use redirect (reply) URIs with static query parameters (such as `https://contoso.com/oauth2?idp=microsoft`) for OAuth 2.0 requests. Dynamic redirect URIs are still forbidden as they represent a security risk, and this can't be used to retain state information across an authentication request - for that, use the `state` parameter.
-The static query parameter is subject to string matching for redirect URIs like any other part of the redirect URI - if no string is registered that matches the URI-decoded redirect_uri, then the request will be rejected. If the URI is found in the app registration, then the entire string will be used to redirect the user, including the static query parameter.
+The static query parameter is subject to string matching for redirect URIs like any other part of the redirect URI - if no string is registered that matches the URI-decoded redirect_uri, then the request will be rejected. If the URI is found in the app registration, then the entire string will be used to redirect the user, including the static query parameter.
-Note that at this time (End of July 2019), the app registration UX in Azure portal still block query parameters. However, you can edit the application manifest manually to add query parameters and test this in your app.
+At this time (End of July 2019), the app registration UX in Azure portal still block query parameters. However, you can edit the application manifest manually to add query parameters and test this in your app.
## March 2019
Note that at this time (End of July 2019), the app registration UX in Azure port
**Protocol impacted**: All flows
-Client applications can sometimes misbehave, issuing hundreds of the same login request over a short period of time. These requests may or may not be successful, but they all contribute to poor user experience and heightened workloads for the IDP, increasing latency for all users and reducing availability of the IDP. These applications are operating outside the bounds of normal usage, and should be updated to behave correctly.
+Client applications can sometimes misbehave, issuing hundreds of the same login request over a short period of time. These requests may or may not be successful, but they all contribute to poor user experience and heightened workloads for the IDP, increasing latency for all users and reducing availability of the IDP. These applications are operating outside the bounds of normal usage, and should be updated to behave correctly.
Clients that issue duplicate requests multiple times will be sent an `invalid_grant` error: `AADSTS50196: The server terminated an operation because it encountered a loop while processing a request`.
-Most clients will not need to change behavior to avoid this error. Only misconfigured clients (those without token caching or those exhibiting prompt loops already) will be impacted by this error. Clients are tracked on a per-instance basis locally (via cookie) on the following factors:
+Most clients won't need to change behavior to avoid this error. Only misconfigured clients (those without token caching or those exhibiting prompt loops already) will be impacted by this error. Clients are tracked on a per-instance basis locally (via cookie) on the following factors:
* User hint, if any
Most clients will not need to change behavior to avoid this error. Only misconf
* Response type and mode
-Apps making multiple requests (15+) in a short period of time (5 minutes) will receive an `invalid_grant` error explaining that they are looping. The tokens being requested have sufficiently long-lived lifetimes (10 minutes minimum, 60 minutes by default), so repeated requests over this time period are unnecessary.
+Apps making multiple requests (15+) in a short period of time (5 minutes) will receive an `invalid_grant` error explaining that they're looping. The tokens being requested have sufficiently long-lived lifetimes (10 minutes minimum, 60 minutes by default), so repeated requests over this time period are unnecessary.
-All apps should handle `invalid_grant` by showing an interactive prompt, rather than silently requesting a token. In order to avoid this error, clients should ensure they are correctly caching the tokens they receive.
+All apps should handle `invalid_grant` by showing an interactive prompt, rather than silently requesting a token. To avoid this error, clients should ensure they're correctly caching the tokens they receive.
## October 2018
Starting on November 15, 2018, Azure AD will stop accepting previously used auth
If your app reuses authorization codes to get tokens for multiple resources, we recommend that you use the code to get a refresh token, and then use that refresh token to acquire additional tokens for other resources. Authorization codes can only be used once, but refresh tokens can be used multiple times across multiple resources. Any new app that attempts to reuse an authentication code during the OAuth code flow will get an invalid_grant error.
-For more information about refresh tokens, see [Refreshing the access tokens](v2-oauth2-auth-code-flow.md#refresh-the-access-token). If using ADAL or MSAL, this is handled for you by the library - replace the second instance of 'AcquireTokenByAuthorizationCodeAsync' with 'AcquireTokenSilentAsync'.
+For more information about refresh tokens, see [Refreshing the access tokens](v2-oauth2-auth-code-flow.md#refresh-the-access-token). If using ADAL or MSAL, this is handled for you by the library - replace the second instance of `AcquireTokenByAuthorizationCodeAsync` with `AcquireTokenSilentAsync`.
## May 2018
-### ID tokens cannot be used for the OBO flow
+### ID tokens can't be used for the OBO flow
**Date**: May 1, 2018
For more information about refresh tokens, see [Refreshing the access tokens](v2
**Protocols impacted**: Implicit flow and [on-behalf-of flow](v2-oauth2-on-behalf-of-flow.md)
-After May 1, 2018, id_tokens cannot be used as the assertion in an OBO flow for new applications. Access tokens should be used instead to secure APIs, even between a client and middle tier of the same application. Apps registered before May 1, 2018 will continue to work and be able to exchange id_tokens for an access token; however, this pattern is not considered a best practice.
+After May 1, 2018, id_tokens can't be used as the assertion in an OBO flow for new applications. Access tokens should be used instead to secure APIs, even between a client and middle tier of the same application. Apps registered before May 1, 2018 will continue to work and be able to exchange id_tokens for an access token; however, this pattern isn't considered a best practice.
To work around this change, you can do the following:
active-directory Sample V2 Code https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/sample-v2-code.md
Each code sample includes a _README.md_ file describing how to build the project
These samples show how to write a single-page application secured with Microsoft identity platform. These samples use one of the flavors of MSAL.js. > [!div class="mx-tdCol2BreakAll"]
-> | Language/<br/>Platform | Code sample(s) <br/>on GitHub | Auth<br/> libraries | Auth flow |
-> | - | -- | - | -- |
+> | Language/<br/>Platform | Code sample(s) <br/>on GitHub | Auth<br/> libraries | Auth flow |
+> | - | -- | - | -- |
> | Angular | &#8226; [Sign in users](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/1-Authentication/1-sign-in/README.md)<br/>&#8226; [Sign in users (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/1-Authentication/2-sign-in-b2c/README.md) <br/> &#8226; [Call Microsoft Graph](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/2-Authorization-I/1-call-graph/README.md)<br/>&#8226; [Call .NET Core web API](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/3-Authorization-II/1-call-api)<br/>&#8226; [Call .NET Core web API (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/3-Authorization-II/2-call-api-b2c)<br/>&#8226; [Call Microsoft Graph via OBO](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/7-AdvancedScenarios/1-call-api-obo/README.md)<br/>&#8226; [Call .NET Core web API using PoP](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/7-AdvancedScenarios/2-call-api-pop/README.md)<br/>&#8226; [Use App Roles for access control](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/5-AccessControl/1-call-api-roles/README.md)<br/> &#8226; [Use Security Groups for access control](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/5-AccessControl/2-call-api-groups/README.md)<br/>&#8226; [Deploy to Azure Storage and App Service](https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/tree/main/4-Deployment/README.md)| MSAL Angular | &#8226; Authorization code with PKCE<br/>&#8226; On-behalf-of (OBO) <br/>&#8226; Proof of Possession (PoP)| > | Blazor WebAssembly | &#8226; [Sign in users](https://github.com/Azure-Samples/ms-identity-blazor-wasm/blob/main/WebApp-OIDC/MyOrg/README.md)<br/>&#8226; [Sign in users (B2C)](https://github.com/Azure-Samples/ms-identity-blazor-wasm/blob/main/WebApp-OIDC/B2C/README.md)<br/>&#8226; [Call Microsoft Graph](https://github.com/Azure-Samples/ms-identity-blazor-wasm/blob/main/WebApp-graph-user/Call-MSGraph/README.md)<br/>&#8226; [Deploy to Azure App Service](https://github.com/Azure-Samples/ms-identity-blazor-wasm/blob/main/Deploy-to-Azure/README.md) | MSAL.js | Implicit Flow |
-> | JavaScript | &#8226; [Sign in users](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/1-Authentication/1-sign-in/README.md)<br/>&#8226; [Sign in users (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/1-Authentication/2-sign-in-b2c/README.md) <br/> &#8226; [Call Microsoft Graph](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/2-Authorization-I/1-call-graph/README.md)<br/>&#8226; [Call Node.js web API](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/3-Authorization-II/1-call-api/README.md)<br/>&#8226; [Call Node.js web API (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/3-Authorization-II/2-call-api-b2c/README.md)<br/>&#8226; [Call Microsoft Graph via OBO](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/4-AdvancedGrants/1-call-api-graph/README.md)<br/>&#8226; [Call Node.js web API via OBO and CA](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/4-AdvancedGrants/2-call-api-api-c)| MSAL.js | &#8226; Authorization code with PKCE<br/>&#8226; On-behalf-of (OBO) <br/>&#8226; Conditional Access (CA) |
-> | React | &#8226; [Sign in users](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/1-Authentication/1-sign-in/README.md)<br/>&#8226; [Sign in users (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/1-Authentication/2-sign-in-b2c/README.md) <br/> &#8226; [Call Microsoft Graph](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/2-Authorization-I/1-call-graph/README.md)<br/>&#8226; [Call Node.js web API](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/3-Authorization-II/1-call-api)<br/>&#8226; [Call Node.js web API (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/3-Authorization-II/2-call-api-b2c)<br/>&#8226; [Call Microsoft Graph via OBO](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/6-AdvancedScenarios/1-call-api-obo/README.md)<br/>&#8226; [Call Node.js web API using PoP](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/6-AdvancedScenarios/2-call-api-pop/README.md)<br/>&#8226; [Use App Roles for access control](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/5-AccessControl/1-call-api-roles/README.md)<br/>&#8226; [Use Security Groups for access control](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/5-AccessControl/2-call-api-groups/README.md)<br/>&#8226; [Deploy to Azure Storage and App Service](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/4-Deployment/1-deploy-storage/README.md)<br/>&#8226; [Deploy to Azure Static Web Apps](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/4-Deployment/2-deploy-static/README.md)| MSAL React | &#8226; Authorization code with PKCE<br/>&#8226; On-behalf-of (OBO) <br/>&#8226; Conditional Access (CA)<br/>&#8226; Proof of Possession (PoP) |
+> | JavaScript | &#8226; [Sign in users](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/1-Authentication/1-sign-in/README.md)<br/>&#8226; [Sign in users (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/1-Authentication/2-sign-in-b2c/README.md) <br/> &#8226; [Call Microsoft Graph](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/2-Authorization-I/1-call-graph/README.md)<br/>&#8226; [Call Node.js web API](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/3-Authorization-II/1-call-api/README.md)<br/>&#8226; [Call Node.js web API (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/3-Authorization-II/2-call-api-b2c/README.md)<br/>&#8226; [Call Microsoft Graph via OBO](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/4-AdvancedGrants/1-call-api-graph/README.md)<br/>&#8226; [Call Node.js web API via OBO and CA](https://github.com/Azure-Samples/ms-identity-javascript-tutorial/tree/main/4-AdvancedGrants/2-call-api-api-c)| MSAL.js | &#8226; Authorization code with PKCE<br/>&#8226; On-behalf-of (OBO) <br/>&#8226; Conditional Access |
+> | React | &#8226; [Sign in users](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/1-Authentication/1-sign-in/README.md)<br/>&#8226; [Sign in users (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/1-Authentication/2-sign-in-b2c/README.md) <br/> &#8226; [Call Microsoft Graph](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/2-Authorization-I/1-call-graph/README.md)<br/>&#8226; [Call Node.js web API](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/3-Authorization-II/1-call-api)<br/>&#8226; [Call Node.js web API (B2C)](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/3-Authorization-II/2-call-api-b2c)<br/>&#8226; [Call Microsoft Graph via OBO](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/6-AdvancedScenarios/1-call-api-obo/README.md)<br/>&#8226; [Call Node.js web API using PoP](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/6-AdvancedScenarios/2-call-api-pop/README.md)<br/>&#8226; [Use App Roles for access control](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/5-AccessControl/1-call-api-roles/README.md)<br/>&#8226; [Use Security Groups for access control](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/5-AccessControl/2-call-api-groups/README.md)<br/>&#8226; [Deploy to Azure Storage and App Service](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/4-Deployment/1-deploy-storage/README.md)<br/>&#8226; [Deploy to Azure Static Web Apps](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/4-Deployment/2-deploy-static/README.md)| MSAL React | &#8226; Authorization code with PKCE<br/>&#8226; On-behalf-of (OBO) <br/>&#8226; Conditional Access<br/>&#8226; Proof of Possession (PoP) |
## Web applications
The following samples show how to protect a web API with the Microsoft identity
The following samples show public client desktop applications that access the Microsoft Graph API, or your own web API in the name of the user. Apart from the _Desktop (Console) with Web Authentication Manager (WAM)_ sample, all these client applications use the Microsoft Authentication Library (MSAL). > [!div class="mx-tdCol2BreakAll"]
-> | Language/<br/>Platform | Code sample(s) <br/> on GitHub | Auth<br/> libraries | Auth flow |
+> | Language/<br/>Platform | Code sample(s) <br/> on GitHub | Auth<br/> libraries | Auth flow |
> | - | -- | - | -- | > | .NET Core | &#8226; [Call Microsoft Graph](https://github.com/Azure-Samples/ms-identity-dotnet-desktop-tutorial/tree/master/1-Calling-MSGraph/1-1-AzureAD) <br/> &#8226; [Call Microsoft Graph with token cache](https://github.com/Azure-Samples/ms-identity-dotnet-desktop-tutorial/tree/master/2-TokenCache) <br/> &#8226; [Call Micrsoft Graph with custom web UI HTML](https://github.com/Azure-Samples/ms-identity-dotnet-desktop-tutorial/tree/master/3-CustomWebUI/3-1-CustomHTML) <br/> &#8226; [Call Microsoft Graph with custom web browser](https://github.com/Azure-Samples/ms-identity-dotnet-desktop-tutorial/tree/master/3-CustomWebUI/3-2-CustomBrowser) <br/> &#8226; [Sign in users with device code flow](https://github.com/Azure-Samples/ms-identity-dotnet-desktop-tutorial/tree/master/4-DeviceCodeFlow) | MSAL.NET |&#8226; Authorization code with PKCE <br/> &#8226; Device code | > | .NET | &#8226; [Call Microsoft Graph with daemon console](https://github.com/Azure-Samples/active-directory-dotnetcore-daemon-v2/tree/master/1-Call-MSGraph) <br/> &#8226; [Call web API with daemon console](https://github.com/Azure-Samples/active-directory-dotnetcore-daemon-v2/blob/master/2-Call-OwnApi/README.md) | MSAL.NET | Authorization code with PKCE |
The following sample shows a public client application running on a device witho
The following sample illustrates Microsoft Teams Tab application that signs in users. Additionally it demonstrates how to call Microsoft Graph API with the user's identity using the Microsoft Authentication Library (MSAL). > [!div class="mx-tdCol2BreakAll"]
-> | Language/<br/>Platform | Code sample(s) <br/>on GitHub | Auth<br/> libraries | Auth flow |
-> | - | -- | - | -- |
+> | Language/<br/>Platform | Code sample(s) <br/>on GitHub | Auth<br/> libraries | Auth flow |
+> | - | -- | - | -- |
> | Node.js | [Teams Tab app: single sign-on (SSO) and call Microsoft Graph](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-sso/nodejs) | MSAL Node | On-Behalf-Of (OBO) | ## Multi-tenant SaaS
active-directory Scenario Daemon Acquire Token https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/scenario-daemon-acquire-token.md
Title: Acquire tokens to call a web API (daemon app) - The Microsoft identity platform | Azure
+ Title: Acquire tokens to call a web API (daemon app) - The Microsoft identity platform
description: Learn how to build a daemon app that calls web APIs (acquiring tokens)
- Previously updated : 10/30/2019 Last updated : 05/12/2022 -- #Customer intent: As an application developer, I want to know how to write a daemon app that can call web APIs by using the Microsoft identity platform.- # Daemon app that calls web APIs - acquire a token
final static String GRAPH_DEFAULT_SCOPE = "https://graph.microsoft.com/.default"
```JavaScript const tokenRequest = {
- scopes: [process.env.GRAPH_ENDPOINT + '.default'], // e.g. 'https://graph.microsoft.com/.default'
+ scopes: [process.env.GRAPH_ENDPOINT + '.default'], // e.g. 'https://graph.microsoft.com/.default'
}; ```
Content: {
### Are you calling your own API?
-If you call your own web API and couldn't add an app permission to the app registration for your daemon app, did you expose an app role in your web API?
-
-For details, see [Exposing application permissions (app roles)](scenario-protected-web-api-app-registration.md#exposing-application-permissions-app-roles) and, in particular, [Ensuring that Azure AD issues tokens for your web API to only allowed clients](scenario-protected-web-api-app-registration.md#ensuring-that-azure-ad-issues-tokens-for-your-web-api-to-only-allowed-clients).
+If your daemon app calls your own web API and you weren't able to add an app permission to the daemon's app registration, you need to [Add app roles to the web API's app registration](howto-add-app-roles-in-azure-ad-apps.md).
## Next steps
active-directory Scenario Daemon App Registration https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/scenario-daemon-app-registration.md
A daemon application can request only application permissions to APIs (not deleg
![App permissions and admin consent](media/scenario-daemon-app/app-permissions-and-admin-consent.png)
-The web API that you want to call needs to define _Application permissions (app roles)_, not delegated permissions. For details on how to expose such an API, see [Protected web API: App registration - when your web API is called by a daemon app](scenario-protected-web-api-app-registration.md#if-your-web-api-is-called-by-a-daemon-app).
+The web API that you want to call needs to define _Application permissions (app roles)_, not delegated permissions. For details on how to expose such an API, see [Protected web API: App registration - when your web API is called by a daemon app](scenario-protected-web-api-app-registration.md#if-your-web-api-is-called-by-a-service-or-daemon-app).
Daemon applications require that a tenant admin pre-consent to the application calling the web API. Tenant admins provide this consent on the same **API permission** page by selecting **Grant admin consent to _our organization_**
active-directory Scenario Mobile Call Api https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/scenario-mobile-call-api.md
Last updated 05/18/2020 -+ #Customer intent: As an application developer, I want to know how to write a mobile app that calls web APIs by using the Microsoft identity platform.
After your app signs in a user and receives tokens, the Microsoft Authentication
In this article, we'll first look at the MSAL result. Then we'll look at how to use an access token from `AuthenticationResult` or `result` to call a protected web API. ## MSAL result
-MSAL provides the following values:
+MSAL provides the following values:
- `AccessToken` calls protected web APIs in an HTTP bearer request. - `IdToken` contains useful information about the signed-in user. This information includes the user's name, the home tenant, and a unique identifier for storage. - `ExpiresOn` is the expiration time of the token. MSAL handles an app's automatic refresh.-- `TenantId` is the identifier of the tenant where the user signed in. For guest users in Azure Active Directory (Azure AD) B2B, this value identifies the tenant where the user signed in. The value doesn't identify the user's home tenant.
+- `TenantId` is the identifier of the tenant where the user signed in. For guest users in Azure Active Directory (Azure AD) B2B, this value identifies the tenant where the user signed in. The value doesn't identify the user's home tenant.
- `Scopes` indicates the scopes that were granted with your token. The granted scopes might be a subset of the scopes that you requested. MSAL also provides an abstraction for an `Account` value. An `Account` value represents the current user's signed-in account:
After you have the access token, you can call a web API. Your app will use the t
@Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>();
-
+ // Put access token in HTTP request. headers.put("Authorization", "Bearer " + authResult.getAccessToken()); return headers;
NSMutableURLRequest *urlRequest = [NSMutableURLRequest new];
urlRequest.URL = [NSURL URLWithString:"https://contoso.api.com"]; urlRequest.HTTPMethod = @"GET"; urlRequest.allHTTPHeaderFields = @{ @"Authorization" : [NSString stringWithFormat:@"Bearer %@", accessToken] };
-
+ NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {}];
let urlRequest = NSMutableURLRequest()
urlRequest.url = URL(string: "https://contoso.api.com")! urlRequest.httpMethod = "GET" urlRequest.allHTTPHeaderFields = [ "Authorization" : "Bearer \(accessToken)" ]
-
+ let task = URLSession.shared.dataTask(with: urlRequest as URLRequest) { (data: Data?, response: URLResponse?, error: Error?) in } task.resume() ```
To call the same API several times, or call multiple APIs, then consider the fol
- **Incremental consent**: The Microsoft identity platform allows apps to get user consent when permissions are required rather than all at the start. Each time your app is ready to call an API, it should request only the scopes that it needs. -- **Conditional access**: When you make several API requests, in certain scenarios you might have to meet additional conditional-access requirements. Requirements can increase in this way if the first request has no conditional-access policies and your app attempts to silently access a new API that requires conditional access. To handle this problem, be sure to catch errors from silent requests, and be prepared to make an interactive request. For more information, see [Guidance for conditional access](../azuread-dev/conditional-access-dev-guide.md).
+- **Conditional Access**: When you make several API requests, in certain scenarios you might have to meet additional conditional-access requirements. Requirements can increase in this way if the first request has no conditional-access policies and your app attempts to silently access a new API that requires conditional access. To handle this problem, be sure to catch errors from silent requests, and be prepared to make an interactive request. For more information, see [Guidance for conditional access](../azuread-dev/conditional-access-dev-guide.md).
## Call several APIs by using incremental consent and conditional access
active-directory Scenario Protected Web Api App Configuration https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/scenario-protected-web-api-app-configuration.md
Title: Configure protected web API apps | Azure-
+ Title: Configure protected web API apps
description: Learn how to build a protected web API and configure your application's code.
- Previously updated : 07/15/2020 Last updated : 05/12/2022 - #Customer intent: As an application developer, I want to know how to write a protected web API using the Microsoft identity platform for developers.
This section describes how to configure a bearer token.
#### Case where you used a custom App ID URI for your web API
-If you've accepted the App ID URI proposed by the app registration portal, you don't need to specify the audience (see [Application ID URI and scopes](scenario-protected-web-api-app-registration.md#application-id-uri-and-scopes)). Otherwise, you should add an `Audience` property whose value is the App ID URI for your web API.
+If you've accepted the default App ID URI proposed by the Azure portal, you don't need to specify the audience (see [Application ID URI and scopes](scenario-protected-web-api-app-registration.md#scopes-and-the-application-id-uri)). Otherwise, add an `Audience` property whose value is the App ID URI for your web API.
```Json {
active-directory Scenario Protected Web Api App Registration https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/scenario-protected-web-api-app-registration.md
Title: Protected web API app registration | Azure description: Learn how to build a protected web API and the information you need to register the app.- - Previously updated : 10/26/2021 Last updated : 01/27/2022
-#Customer intent: As an application developer, I want to know how to write a protected web API using the Microsoft identity platform for developers.
+# Customer intent: As an application developer, I want to know how to write a protected web API using the Microsoft identity platform for developers.
# Protected web API: App registration
Web APIs don't need to register a redirect URI because no user is interactively
Other settings specific to web APIs are the exposed API and the exposed scopes or app roles.
-### Application ID URI and scopes
+## Scopes and the Application ID URI
Scopes usually have the form `resourceURI/scopeName`. For Microsoft Graph, the scopes have shortcuts. For example, `User.Read` is a shortcut for `https://graph.microsoft.com/user.read`.
Scopes also appear on the consent window that's presented to users of your app.
App roles cannot be consented to by a user (as they're used by an application that call the web API on behalf of itself). A tenant administrator will need to consent to client applications of your web API exposing app roles. See [Admin consent](v2-admin-consent.md) for details.
-### Exposing delegated permissions (scopes)
+### Expose delegated permissions (scopes)
-1. Select **Expose an API** in the application registration.
-1. Select **Add a scope**.
-1. If prompted, accept the proposed application ID URI (`api://{clientId}`) by selecting **Save and Continue**.
-1. Specify these values:
- - Select **Scope name** and enter **access_as_user**.
- - Select **Who can consent** and make sure **Admins and users** is selected.
- - Select **Admin consent display name** and enter **Access TodoListService as a user**.
- - Select **Admin consent description** and enter **Accesses the TodoListService web API as a user**.
- - Select **User consent display name** and enter **Access TodoListService as a user**.
- - Select **User consent description** and enter **Accesses the TodoListService web API as a user**.
- - Keep the **State** value set to **Enabled**.
-1. Select **Add scope**.
+To expose delegated permissions, or _scopes_, follow the steps in [Configure an application to expose a web API](quickstart-configure-app-expose-web-apis.md).
-### If your web API is called by a daemon app
+If you're following along with the web API scenario described in this set of articles, use these settings:
-In this section, you learn how to register your protected web API so that daemon apps can securely call it.
+- **Application ID URI**: Accept the proposed application ID URI (_api://\<clientId\>_) (if prompted)
+- **Scope name**: _access_as_user_
+- **Who can consent**: _Admins and users_
+- **Admin consent display name**: _Access TodoListService as a user_
+- **Admin consent description**: _Accesses the TodoListService web API as a user_
+- **User consent display name**: _Access TodoListService as a user_
+- **User consent description**: _Accesses the TodoListService web API as a user_
+- **State**: _Enabled_
-- You declare and expose only _application permissions_ because daemon apps don't interact with users. Delegated permissions wouldn't make sense.-- Tenant admins can require Azure AD to issue web API tokens only to applications that have registered to access one of the API's application permissions.
+### If your web API is called by a service or daemon app
-#### Exposing application permissions (app roles)
+Expose _application permissions_ instead of delegated permissions if your API should be accessed by daemons, services, or other non-interactive (by a human) applications. Because daemon- and service-type applications run unattended and authenticate with their own identity, there is no user to "delegate" their permission.
-To expose application permissions, edit the manifest.
-1. In the application registration for your application, select **Manifest**.
-1. To edit the manifest, find the `appRoles` setting and add application roles. The role definitions are provided in the following sample JSON block.
-1. Leave `allowedMemberTypes` set to `"Application"` only.
-1. Make sure `id` is a unique GUID.
-1. Make sure `displayName` and `value` don't contain spaces.
-1. Save the manifest.
+#### Expose application permissions (app roles)
-The following sample shows the contents of `appRoles`, where the value of `id` can be any unique GUID.
+To expose application permissions, follow the steps in [Add app roles to your app](howto-add-app-roles-in-azure-ad-apps.md).
-```json
-"appRoles": [
- {
- "allowedMemberTypes": [ "Application" ],
- "description": "Accesses the TodoListService-Cert as an application.",
- "displayName": "access_as_application",
- "id": "ccf784a6-fd0c-45f2-9c08-2f9d162a0628",
- "isEnabled": true,
- "lang": null,
- "origin": "Application",
- "value": "access_as_application"
- }
-],
-```
+In the **Create app role** pane under **Allowed member types**, select **Applications**. Or, add the role by using the **Application manifest editor** as described in the article.
-#### Ensuring that Azure AD issues tokens for your web API to only allowed clients
+#### Restrict access tokens to specific clients apps
-The web API checks for the app role. This role is a software developer's way to expose application permissions. You can also configure Azure AD to issue API tokens only to apps that the tenant admin approves for API access.
+App roles are the mechanism an application developer uses to expose their app's permissions. Your web API's code should check for app roles in the access tokens it receives from callers.
-To add this increased security:
+To add another layer of security, an Azure AD tenant administrator can configure their tenant so the Microsoft identity platform issues security tokens _only_ to the client apps they've approved for API access.
-1. Go to the app **Overview** page for your app registration.
-1. Under **Managed application in local directory**, select the link with the name of your app. The label for this selection might be truncated. For example, you might see **Managed application in ...**
+To increase security by restricting token issuance only to client apps that have been assigned app roles:
- When you select this link, you go to the **Enterprise Application Overview** page. This page is associated with the service principal for your application in the tenant where you created it. You can go to the app registration page by using the back button of your browser.
-
-1. Select the **Properties** page in the **Manage** section of the Enterprise application pages.
-1. If you want Azure AD to allow access to your web API from only certain clients, set **User assignment required?** to **Yes**.
+1. In the Azure portal, select your app in **Azure Active Directory** > **App registrations**.
+1. On the application's overview page, select its **Managed application in local directory** link to navigate to its **Enterprise Application Overview** page.
+1. Under **Manage**, select **Properties**.
+1. Set **Assignment required?** to **Yes**.
+1. Select **Save**.
-
- If you set **User assignment required?** to **Yes**, Azure AD checks the app role assignments of a client when it requests a web API access token. If the client isn't assigned to any app roles, Azure AD will return the error message "invalid_client: AADSTS501051: Application \<application name\> isn't assigned to a role for the \<web API\>".
-
- If you keep **User assignment required?** set to **No**, Azure AD wonΓÇÖt check the app role assignments when a client requests an access token for your web API. Any daemon client, meaning any client using the client credentials flow, can get an access token for the API just by specifying its audience. Any application can access the API without having to request permissions for it.
-
- But as explained in the previous section, your web API can always verify that the application has the right role, which is authorized by the tenant admin. The API performs this verification by validating that the access token has a role claim and that the value for this claim is correct. In the previous JSON sample, the value is `access_as_application`.
+Azure AD will now check for app role assignments of client applications that request access tokens for your web API. If a client app hasn't been assigned any app roles, Azure AD returns an error message to the client similar to _invalid_client: AADSTS501051: Application \<application name\> isn't assigned to a role for the \<web API\>_.
-1. Select **Save**.
+> [!WARNING]
+> **DO NOT use AADSTS error codes** or their message strings as literals in your application's code. The "AADSTS" error codes and the error message strings returned by Azure AD are _not immutable_, and may be changed by Microsoft at any time and without your knowledge. If you make branching decisions in your code based on the values of either the AADSTS codes or their message strings, you put your application's functionality and stability at risk.
## Next steps
-Move on to the next article in this scenario,
-[App code configuration](scenario-protected-web-api-app-configuration.md).
+The next article in this series is [App code configuration](scenario-protected-web-api-app-configuration.md).
active-directory Scenario Protected Web Api Verification Scope App Roles https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/scenario-protected-web-api-verification-scope-app-roles.md
Title: Verify scopes and app roles protected web API | Azure-
+ Title: Verify scopes and app roles protected web API
description: Verify that the API is only called by applications on behalf of users who have the right scopes and by daemon apps that have the right application roles.
- Previously updated : 10/19/2021 Last updated : 05/12/2022 - #Customer intent: As an application developer, I want to learn how to write a protected web API using the Microsoft identity platform for developers.
For a full version of `ValidateScopes` for ASP.NET Core, [_ScopesRequiredHttpCon
## Verify app roles in APIs called by daemon apps
-If your web API is called by a [daemon app](scenario-daemon-overview.md), that app should require an application permission to your web API. As shown in [Exposing application permissions (app roles)](./scenario-protected-web-api-app-registration.md#exposing-application-permissions-app-roles), your API exposes such permissions. One example is the `access_as_application` app role.
+If your web API is called by a [daemon app](scenario-daemon-overview.md), that app should require an application permission to your web API. As shown in [Exposing application permissions (app roles)](./scenario-protected-web-api-app-registration.md#expose-application-permissions-app-roles), your API exposes such permissions. One example is the `access_as_application` app role.
You now need to have your API verify that the token it receives contains the `roles` claim and that this claim has the expected value. The verification code is similar to the code that verifies delegated permissions, except that your controller action tests for roles instead of scopes:
For a full version of `ValidateAppRole` for ASP.NET Core, see [_RolesRequiredHtt
Users can also use roles claims in user assignment patterns, as shown in [How to add app roles in your application and receive them in the token](howto-add-app-roles-in-azure-ad-apps.md). If the roles are assignable to both, checking roles will let apps sign in as users and users sign in as apps. We recommend that you declare different roles for users and apps to prevent this confusion.
-If you have defined app roles with user/group, then roles claim can also be verified in the API along with scopes. The verification logic of the app roles in this scenario remains same as if API is called by the daemon apps since there is no differentiation in the role claim for user/group and application.
+If you have defined app roles with user/group, then roles claim can also be verified in the API along with scopes. The verification logic of the app roles in this scenario remains same as if API is called by the daemon apps since there is no differentiation in the role claim for user/group and application.
### Accepting app-only tokens if the web API should be called only by daemon apps
active-directory Test Automate Integration Testing https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/test-automate-integration-testing.md
Title: Run automated integration tests
+ Title: Run automated integration tests
description: Learn how to run automated integration tests as a user against APIs protected by the Microsoft identity platform. Use the Resource Owner Password Credential Grant (ROPC) auth flow to sign in as a user instead of automating the interactive sign-in prompt UI.
ROPC is a public client flow, so you need to enable your app for public client f
Since ROPC is not an interactive flow, you won't be prompted with a consent screen to consent to these at runtime. Pre-consent to the permissions to avoid errors when acquiring tokens.
-Add the permissions to your app. Do not add any sensitive or high-privilege permissions to the app, we recommend you scope your testing scenarios to basic integration scenarios around integrating with Azure AD.
+Add the permissions to your app. Do not add any sensitive or high-privilege permissions to the app, we recommend you scope your testing scenarios to basic integration scenarios around integrating with Azure AD.
From your app registration in the [Azure portal](https://portal.azure.com), go to **API Permissions** > **Add a permission**. Add the permissions you need to call the APIs you'll be using. A test example further in this article uses the `https://graph.microsoft.com/User.Read` and `https://graph.microsoft.com/User.ReadBasic.All` permissions.
Replace *{tenant}* with your tenant ID, *{your_client_ID}* with the client ID of
Your tenant likely has a conditional access policy that [requires multifactor authentication (MFA) for all users](../conditional-access/howto-conditional-access-policy-all-users-mfa.md), as recommended by Microsoft. MFA won't work with ROPC, so you'll need to exempt your test applications and test users from this requirement. To exclude user accounts:
-1. Navigate to the [Azure portal](https://portal.azure.com) and sign in to your tenant. Select **Azure Active Directory**. Select **Security** in the left navigation pane and then select **Conditional access**.
+1. Navigate to the [Azure portal](https://portal.azure.com) and sign in to your tenant. Select **Azure Active Directory**. Select **Security** in the left navigation pane and then select **Conditional Access**.
1. In **Policies**, select the conditional access policy that requires MFA. 1. Select **Users or workload identities**. 1. Select the **Exclude** tab and then the **Users and groups** checkbox.
Add the client ID of the test app you previously created, the necessary scopes,
{ "Authentication": { "AzureCloudInstance": "AzurePublic", //Will be different for different Azure clouds, like US Gov
- "AadAuthorityAudience": "AzureAdMultipleOrgs",
+ "AadAuthorityAudience": "AzureAdMultipleOrgs",
"ClientId": <your_client_ID> }, "WebAPI": { "Scopes": [ //For this Microsoft Graph example. Your value(s) will be different depending on the API you're calling
- "https://graph.microsoft.com/User.Read",
+ "https://graph.microsoft.com/User.Read",
//For this Microsoft Graph example. Your value(s) will be different depending on the API you're calling
- "https://graph.microsoft.com/User.ReadBasic.All"
+ "https://graph.microsoft.com/User.ReadBasic.All"
] },
public async Task InitializeAsync()
} };
- string keyVaultUri = Configuration.GetValue<string>("KeyVault:KeyVaultUri");
+ string keyVaultUri = Configuration.GetValue<string>("KeyVault:KeyVaultUri");
var client = new SecretClient(new Uri(keyVaultUri), new DefaultAzureCredential(), options);
- KeyVaultSecret userNameSecret = client.GetSecret("TestUserName");
+ KeyVaultSecret userNameSecret = client.GetSecret("TestUserName");
KeyVaultSecret passwordSecret = client.GetSecret("TestPassword"); string password = passwordSecret.Value;
active-directory Test Setup Environment https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/test-setup-environment.md
Title: Set up a test environment for your app
-description: Learn how to set up an Azure Active Directory test environment so you can test your application integrated with Microsoft identity platform. Evaluate whether you need a separate tenant for testing or if you can use your production tenant.
+description: Learn how to set up an Azure Active Directory test environment so you can test your application integrated with Microsoft identity platform. Evaluate whether you need a separate tenant for testing or if you can use your production tenant.
-+ - Previously updated : 05/02/2022 Last updated : 05/11/2022 --
-#Customer intent: As a developer, I want to set up a test environment so that I can test my app integrated with Microsoft identity platform.
+
+# Customer intent: As a developer, I want to set up a test environment so that I can test my app integrated with Microsoft identity platform.
# Set up your application's Azure AD test environment
-As a developer, you use the software development lifecycle and move your app between development, test, and production environments. When this process is used for applications protected by the Microsoft identity platform, you should set up an Azure Active Directory (Azure AD) environment to be used for testing. This environment can be used in the early testing stages of the development lifecycle as well as a long-term, permanent test environment. Depending on your resource isolation requirements, you can use your organization's Azure AD production tenant or an entirely separate tenant for testing.
+To help move your app through the development, test, and production lifecycle, set up an Azure Active Directory (Azure AD) test environment. You can use your Azure AD test environment during the early stages of app development and long-term as a permanent test environment.
-In this article, you learn how to set up an Azure AD test environment so you can test your application integrated with Microsoft identity platform. Evaluate the level of isolation needed and whether you need a separate tenant for testing or if you can use your production tenant.
+## Dedicated test tenant or production Azure AD tenant?
-## Decide the level of isolation needed
-In general, it is easier and less overhead to use your production tenant as a test environment. However, this is only a viable option if you can achieve the right level of isolation between test and production resources. Isolation is especially important for high privilege scenarios.
+Your first task is to decide between using an Azure AD tenant dedicated to testing or your production tenant as your test environment.
-Set up your test environment in a separate tenant (not your organization's production tenant) if:
-- You have a set of resources that requires unique, tenant-wide settings. For example, your app may need to access tenant resources as itself and not on behalf of a user (uses app-only permissions). App-only access requires admin consent that applies across the entire tenant and those permissions are hard to scope down safely within a tenant boundary.-- You have minimal risk tolerance for unauthorized access by tenant members to your test resources.-- Configuration changes could have critical impact on your production environment.-- You aren't able to create test users and associated test data in your tenant.-- You plan on performing automated sign-ins to your application for testing and your production tenant has configured authentication method policies that require some user interaction. For example, if multifactor authentication is required for all users you won't be able to perform automated sign-ins for integration testing.-- You must ensure that global administrators can't manage or access specific test resources. You'll need to isolate that
-resource in a separate tenant with separate global administrators.
-- Adding non-production resources and/or workload to your production tenant would [exceed service or throttling limits](test-throttle-service-limits.md) for that tenant.
+Using a production tenant can make some aspects of application testing easier, but it requires the right level of isolation between test and production resources. Isolation is especially important for high-privilege scenarios.
-If none of these conditions apply to you, then follow these steps to [set up your test environment in your production tenant](#set-up-a-test-environment-in-your-production-tenant). If any of them do apply, however, you should [set up a test environment in a separate tenant](#set-up-a-test-environment-in-a-separate-tenant).
+Don't use your production Azure AD tenant if:
+
+- Your application uses settings that require tenant-wide uniqueness. For example, your app might need to access tenant resources as itself, not on behalf of a user, by using app-only permissions. App-only access requires admin consent which applies to the entire tenant. Such permissions are hard to scope down safely within a tenant boundary.
+- You have low tolerance of risk for potential unauthorized access of test resources by tenant members.
+- Configuration changes could negatively impact the critical operation of your production environment.
+- You're unable to create users or other test data in your production tenant.
+- Policies are enabled in your production tenant that require user interaction during authentication. For example, if multi-factor authentication is required for all users, you can't use automated sign-ins for integration testing.
+- Adding non-production resources and/or workload to your production tenant would [exceed service or throttling limits](test-throttle-service-limits.md) for the tenant.
+
+If any of these restrictions apply, set up a [test environment in a separate tenant](#set-up-a-test-environment-in-a-separate-tenant).
+
+If none of these restrictions apply, you can set up a [test environment in your production tenant](#set-up-a-test-environment-in-your-production-tenant). Be aware that global administrators in your production tenant can access its resources and change its configuration at any time. To prevent access to any test resources or configuration, put that data in a separate tenant.
## Set up a test environment in a separate tenant
-If you can't safely constrain your test app in your production tenant, you can create a separate tenant for development and testing purposes.
+
+If you can't safely constrain your test app in your production tenant, create a separate tenant for development and testing purposes.
### Get a test tenant
-If you don't already have a dedicated test tenant, you can create one for free using the Microsoft 365 Developer Program or manually create one yourself.
-#### Join the Microsoft 365 Developer Program (recommended)
+If you don't already have a dedicated test tenant, you can create one for free using the Microsoft 365 Developer Program or manually create one yourself.
+
+#### Join the Microsoft 365 Developer Program (recommended)
+ The [Microsoft 365 Developer Program](/office/developer-program/microsoft-365-developer-program) is free and can have test user accounts and sample data packs automatically added to the tenant.+ 1. Click on the **Join now** button on the screen. 2. Sign in with a new Microsoft Account or use an existing (work) account you already have. 3. On the sign-up page select your region, enter a company name and accept the terms and conditions of the program before you click **Next**. 4. Click on **Set Up Subscription**. Specify the region where you want to create your new tenant, create a username, domain, and enter a password. This will create a new tenant and the first administrator of the tenant.
-5. Enter the security information, which is needed to protect the administrator account of your new tenant. This will set up multifactor authentication for the account
+5. Enter the security information, which is needed to protect the administrator account of your new tenant. This will set up multi-factor authentication for the account.
+
+#### Manually create a tenant
-#### Manually create a tenant
You can [manually create a tenant](quickstart-create-new-tenant.md), which will be empty upon creation and will have to be configured with test data.
-### Populate your tenant with users
-For convenience, you may want to invite yourself and other members of your development team to be guest users in the tenant. This will create separate guest objects in the test tenant, but means you only have to manage one set of credentials for your corporate account and your test account.
+### Populate your tenant with users
+
+For convenience, you may want to invite yourself and other members of your development team to be guest users in the tenant. This will create separate guest objects in the test tenant, but means you only have to manage one set of credentials for your corporate account and your test account.
+ 1. From the [Azure portal](https://portal.azure.com), click on **Azure Active Directory**. 2. Go to **Users**. 3. Click on **New guest user** and invite your work account email address. 4. Repeat for other members of the development and/or testing team for your application.
-You can also create test users in your test tenant. If you used one of the Microsoft 365 sample packs, you may already have some test users in your tenant. If not, you should be able to create some yourself as the tenant administrator.
+You can also create test users in your test tenant. If you used one of the Microsoft 365 sample packs, you may already have some test users in your tenant. If not, you should be able to create some yourself as the tenant administrator.
+ 1. From the [Azure portal](https://portal.azure.com), click on **Azure Active Directory**. 2. Go to **Users**. 3. Click **New user** and create some new test users in your directory. ### Get an Azure AD subscription (optional)+ If you want to fully test Azure AD premium features on your application, you'll need to sign up your tenant for a [Premium P1 or Premium P2 license](https://azure.microsoft.com/pricing/details/active-directory/).
-If you signed up using the Microsoft 365 Developer program, your test tenant will come with Azure AD P2 licenses. If not, you can still enable a one month [free trial of Azure AD premium](https://azure.microsoft.com/trial/get-started-active-directory/).
+If you signed up using the Microsoft 365 Developer program, your test tenant will come with Azure AD P2 licenses. If not, you can still enable a one month [free trial of Azure AD premium](https://azure.microsoft.com/trial/get-started-active-directory/).
### Create and configure an app registration
-You'll need to create an app registration to use in your test environment. This should be a separate registration from your eventual production app registration, to maintain security isolation between your test environment and your production environment. How you configure your application depends on the type of app you are building. For more information, check out the app registration steps for your app scenario in the left navigation pane, like this article for [web application registration](scenario-web-app-sign-user-app-registration.md).
-
+
+You'll need to create an app registration to use in your test environment. This should be a separate registration from your eventual production app registration, to maintain security isolation between your test environment and your production environment. How you configure your application depends on the type of app you are building. For more information, check out the app registration steps for your app scenario in the left navigation pane, like this article for [web application registration](scenario-web-app-sign-user-app-registration.md).
+ ### Populate your tenant with policies
-If your app will primarily be used by a single organization (commonly referred to as single tenant), and you have access to that production tenant, then you should try to replicate the settings of your production tenant that can affect your app's behavior. That will lower the chances of unexpected errors when operating in production.
-#### Conditional access policies
+If your app will primarily be used by a single organization (commonly referred to as single tenant), and you have access to that production tenant, then you should try to replicate the settings of your production tenant that can affect your app's behavior. That will lower the chances of unexpected errors when operating in production.
+
+#### Conditional Access policies
+ Replicating conditional access policies ensures you don't encounter unexpected blocked access when moving to production and your application can appropriately handle the errors it's likely to receive.
-Viewing your production tenant conditional access policies may need to be performed by a company administrator.
-1. Sign into the [Azure portal](https://portal.azure.com) using your production tenant account
-1. Go to **Azure Active Directory** > **Enterprise applications** > **Conditional access**.
-1. View the list of policies in your tenant. Click the first one.
-1. Navigate to **Cloud apps or actions**.
-1. If the policy only applies to a select group of apps, then move on to the next policy. If not, then it will likely apply to your app as well when you move to production. You should copy the policy over to your test tenant.
+Viewing your production tenant conditional access policies may need to be performed by a company administrator.
+
+1. Sign into the [Azure portal](https://portal.azure.com) using your production tenant account.
+1. Go to **Azure Active Directory** > **Enterprise applications** > **Conditional Access**.
+1. View the list of policies in your tenant. Click the first one.
+1. Navigate to **Cloud apps or actions**.
+1. If the policy only applies to a select group of apps, then move on to the next policy. If not, then it will likely apply to your app as well when you move to production. You should copy the policy over to your test tenant.
In a new tab or browser session, navigate to the [Azure portal](https://portal.azure.com), and sign into your test tenant.
-1. Go to **Azure Active Directory** > **Enterprise applications** > **Conditional access**.
+
+1. Go to **Azure Active Directory** > **Enterprise applications** > **Conditional Access**.
1. Click on **New policy** 1. Copy the settings from the production tenant policy, identified through the previous steps. #### Permission grant policies
-Replicating permission grant policies ensures you don't encounter unexpected prompts for admin consent when moving to production.
-1. Sign into the [Azure portal](https://portal.azure.com) using your production tenant account
+Replicating permission grant policies ensures you don't encounter unexpected prompts for admin consent when moving to production.
+
+1. Sign into the [Azure portal](https://portal.azure.com) using your production tenant account.
1. Click on **Azure Active Directory**.
-1. Go to **Enterprise applications**.
-1. From your production tenant, go to **Azure Active Directory** > **Enterprise applications** > **Consent and permissions** > **User consent** settings. Copy the settings there to your test tenant.
-
+1. Go to **Enterprise applications**.
+1. From your production tenant, go to **Azure Active Directory** > **Enterprise applications** > **Consent and permissions** > **User consent** settings. Copy the settings there to your test tenant.
+ #### Token lifetime policies
-Replicating token lifetime policies ensures tokens issued to your application don't expire unexpectedly in production.
-
-Token lifetime policies can currently only be managed through PowerShell. Read about [configurable token lifetimes](active-directory-configurable-token-lifetimes.md) to learn about identifying any token lifetime policies that apply to your whole production organization. Copy those policies to your test tenant.
-
+
+Replicating token lifetime policies ensures tokens issued to your application don't expire unexpectedly in production.
+
+Token lifetime policies can currently only be managed through PowerShell. Read about [configurable token lifetimes](active-directory-configurable-token-lifetimes.md) to learn about identifying any token lifetime policies that apply to your whole production organization. Copy those policies to your test tenant.
+ ## Set up a test environment in your production tenant If you can safely constrain your test app in your production tenant, go ahead and set up your tenant for testing purposes. ### Create and configure an app registration
-You'll need to create an app registration to use in your test environment. This should be a separate registration from your eventual production app registration, to maintain security isolation between your test environment and your production environment. How you configure your application depends on the type of app you are building. For more information, check out the [app registration steps for your app scenario](scenario-web-app-sign-user-app-registration.md) in the left navigation pane.
+
+You'll need to create an app registration to use in your test environment. This should be a separate registration from your eventual production app registration, to maintain security isolation between your test environment and your production environment. How you configure your application depends on the type of app you are building. For more information, check out the [app registration steps for your app scenario](scenario-web-app-sign-user-app-registration.md) in the left navigation pane.
### Create some test users
-You'll need to create some test users with associated test data to use while testing your scenarios. This step might need to be performed by an admin
+
+You'll need to create some test users with associated test data to use while testing your scenarios. This step might need to be performed by an admin.
+ 1. From the [Azure portal](https://portal.azure.com), click on **Azure Active Directory**. 2. Go to **Users**. 3. Click **New user** and create some new test users in your directory. ### Add the test users to a group (optional)
-For convenience, you can assign all these users to a group, which makes other assignment operations easier.
+
+For convenience, you can assign all these users to a group, which makes other assignment operations easier.
+ 1. From the [Azure portal](https://portal.azure.com), click on **Azure Active Directory**. 2. Go to **Groups**. 3. Click **New group**.
For convenience, you can assign all these users to a group, which makes other as
6. Add the test users created in the previous step. ### Restrict your test application to specific users
-You can restrict the users in your tenant that are allowed to use your test application to specific users or groups, through user assignment. When you [created an app through App registrations](#create-and-configure-an-app-registration), a representation of your app was created in **Enterprise applications** as well. Use the **Enterprise applications** settings to restrict who can use the application in your tenant.
+
+You can restrict the users in your tenant that are allowed to use your test application to specific users or groups, through user assignment. When you [created an app through App registrations](#create-and-configure-an-app-registration), a representation of your app was created in **Enterprise applications** as well. Use the **Enterprise applications** settings to restrict who can use the application in your tenant.
> [!IMPORTANT]
-> If your app is a [multi-tenant app](v2-supported-account-types.md), this operation won't restrict users in other tenants from signing into and using your app. It will only restrict users in the tenant that user assignment is configured in.
+> If your app is a [multi-tenant app](v2-supported-account-types.md), this operation won't restrict users in other tenants from signing into and using your app. It will only restrict users in the tenant that user assignment is configured in.
For detailed instructions on restricting an app to specific users in a tenant, go to [restricting your app to a set of users](howto-restrict-your-app-to-a-set-of-users.md). ## Next steps
-
+ Learn about [throttling and service limits](test-throttle-service-limits.md) you might hit while setting up a test environment. For more detailed information about test environments, read [Securing Azure environments with Azure Active Directory](https://azure.microsoft.com/resources/securing-azure-environments-with-azure-active-directory/).
-
active-directory V2 Conditional Access Dev Guide https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/v2-conditional-access-dev-guide.md
To try out this scenario, see our [JavaScript SPA calling Node.js web API using
* For more Azure AD code samples, see [samples](sample-v2-code.md). * For more info on the MSAL SDK's and access the reference documentation, see the [Microsoft Authentication Library overview](msal-overview.md). * To learn more about multi-tenant scenarios, see [How to sign in users using the multi-tenant pattern](howto-convert-app-to-be-multi-tenant.md).
-* Learn more about [Conditional access and securing access to IoT apps](/azure/architecture/example-scenario/iot-aad/iot-aad).
+* Learn more about [Conditional Access and securing access to IoT apps](/azure/architecture/example-scenario/iot-aad/iot-aad).
active-directory Zero Trust For Developers https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/develop/zero-trust-for-developers.md
# Build Zero Trust-ready apps using Microsoft identity platform features and tools
-You can no longer assume a secure network perimeter around the applications you build. Nearly every app you build will, by design, be accessed from outside the network perimeter. You also canΓÇÖt guarantee every app you build is secure or will remain so after itΓÇÖs deployed.
+You can no longer assume a secure network perimeter around the applications you build. Nearly every app you build will, by design, be accessed from outside the network perimeter. You also can't guarantee every app you build is secure or will remain so after it's deployed.
-Knowing this as the app developer, it's your responsibility to not only maximize your appΓÇÖs security, but also minimize the damage your app can cause if itΓÇÖs compromised.
+Knowing this as the app developer, it's your responsibility to not only maximize your app's security, but also minimize the damage your app can cause if it's compromised.
Additionally, you are responsible for supporting the evolving needs of your customers and users, who will expect that your application meets their Zero Trust security requirements.
The Microsoft identity platform offers authentication mechanisms for verifying t
|Best practice |Benefits to app security | |-||
-|Use the [Microsoft Authentication Libraries](./reference-v2-libraries.md) (MSAL).|MSAL is a set of MicrosoftΓÇÖs authentication libraries for developers. With MSAL, you can authenticate users and applications, and acquire tokens to access corporate resources using just a few lines of code. MSAL uses modern protocols ([OpenID Connect and OAuth 2.0](./active-directory-v2-protocols.md)) that remove the need for apps to ever handle a user's credentials directly. This vastly improves the security for both users and applications as the identity provider becomes the security perimeter. Also, these protocols continuously evolve to address new paradigms, opportunities, and challenges in identity security.|
-|Adopt enhanced security extensions like [Continuous Access Evaluation](../conditional-access/concept-continuous-access-evaluation.md) (CAE) and Conditional Access authentication context when appropriate.|In Azure AD, some of the most used extensions include [Conditional Access](../conditional-access/overview.md) (CA), [Conditional Access authentication context](./developer-guide-conditional-access-authentication-context.md) and CAE. Applications that use enhanced security features like CAE and Conditional Access authentication context must be coded to handle claims challenges. Open protocols enable you to use the [claims challenges and claims requests](./claims-challenge.md) to invoke extra client capabilities. This might be to indicate to apps that they need to re-interact with Azure AD, like if there was an anomaly or if the user no longer satisfies the conditions under which they authenticated earlier. As a developer you can code for these extensions without disturbing their primary code flows for authentication.|
+|Use the [Microsoft Authentication Libraries](./reference-v2-libraries.md) (MSAL).|MSAL is a set of Microsoft's authentication libraries for developers. With MSAL, you can authenticate users and applications, and acquire tokens to access corporate resources using just a few lines of code. MSAL uses modern protocols ([OpenID Connect and OAuth 2.0](./active-directory-v2-protocols.md)) that remove the need for apps to ever handle a user's credentials directly. This vastly improves the security for both users and applications as the identity provider becomes the security perimeter. Also, these protocols continuously evolve to address new paradigms, opportunities, and challenges in identity security.|
+|Adopt enhanced security extensions like [Continuous Access Evaluation](../conditional-access/concept-continuous-access-evaluation.md) (CAE) and Conditional Access authentication context when appropriate.|In Azure AD, some of the most used extensions include [Conditional Access](../conditional-access/overview.md), [Conditional Access authentication context](./developer-guide-conditional-access-authentication-context.md) and CAE. Applications that use enhanced security features like CAE and Conditional Access authentication context must be coded to handle claims challenges. Open protocols enable you to use the [claims challenges and claims requests](./claims-challenge.md) to invoke extra client capabilities. This might be to indicate to apps that they need to re-interact with Azure AD, like if there was an anomaly or if the user no longer satisfies the conditions under which they authenticated earlier. As a developer you can code for these extensions without disturbing their primary code flows for authentication.|
|Use the correct **authentication flow** by [app type](./v2-app-types.md) for authentication. For web applications, you should always aim to use [confidential client flows](./authentication-flows-app-scenarios.md#single-page-public-client-and-confidential-client-applications). For mobile applications, you should use [brokers](./msal-android-single-sign-on.md#sso-through-brokered-authentication) or the [system browser](./msal-android-single-sign-on.md#sso-through-system-browser) for authentication. |The flows for web applications that can hold a secret (confidential clients) are considered more secure than public clients (for example: Desktop and Console apps). When you use the system web browser to authenticate your mobile apps, you get a secure [single sign-on](../manage-apps/what-is-single-sign-on.md) (SSO) experience that supports app protection policies.| ### Use least privileged access
The Microsoft identity platform app registration portal is the primary entry poi
## Next steps -- Zero Trust [Guidance Center](/security/zero-trust/)
+- Zero Trust [Guidance Center](/security/zero-trust/)
- Microsoft identity platform [best practices and recommendations](./identity-platform-integration-checklist.md).
active-directory Direct Federation Adfs https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/external-identities/direct-federation-adfs.md
Previously updated : 04/14/2022 Last updated : 05/13/2022
-# Example: Configure SAML/WS-Fed based identity provider federation with AD FS (preview)
+# Example: Configure SAML/WS-Fed based identity provider federation with AD FS
>[!NOTE] >- *Direct federation* in Azure Active Directory is now referred to as *SAML/WS-Fed identity provider (IdP) federation*.
->- SAML/WS-Fed IdP federation is a public preview feature of Azure Active Directory. For more information about previews, see [Supplemental Terms of Use for Microsoft Azure Previews](https://azure.microsoft.com/support/legal/preview-supplemental-terms/).
This article describes how to set up [SAML/WS-Fed IdP federation](direct-federation.md) using Active Directory Federation Services (AD FS) as either a SAML 2.0 or WS-Fed IdP. To support federation, certain attributes and claims must be configured at the IdP. To illustrate how to configure an IdP for federation, weΓÇÖll use Active Directory Federation Services (AD FS) as an example. WeΓÇÖll show how to set up AD FS both as a SAML IdP and as a WS-Fed IdP.
active-directory Direct Federation https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/external-identities/direct-federation.md
Previously updated : 03/31/2022 Last updated : 05/13/2022
-# Federation with SAML/WS-Fed identity providers for guest users (preview)
+# Federation with SAML/WS-Fed identity providers for guest users
> [!NOTE] > >- *Direct federation* in Azure Active Directory is now referred to as *SAML/WS-Fed identity provider (IdP) federation*.
->- SAML/WS-Fed IdP federation is a public preview feature of Azure Active Directory. For more information about previews, see [Supplemental Terms of Use for Microsoft Azure Previews](https://azure.microsoft.com/support/legal/preview-supplemental-terms/).
This article describes how to set up federation with any organization whose identity provider (IdP) supports the SAML 2.0 or WS-Fed protocol. When you set up federation with a partner's IdP, new guest users from that domain can use their own IdP-managed organizational account to sign in to your Azure AD tenant and start collaborating with you. There's no need for the guest user to create a separate Azure AD account.
active-directory Miro Provisioning Tutorial https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/active-directory/saas-apps/miro-provisioning-tutorial.md
Before configuring and enabling automatic user provisioning, you should decide w
## Set up Miro for provisioning
-1. To retrieve the needed **Secret Token** contact Miro support team at support@miro.com. This value will be entered in the Secret Token field in the Provisioning tab of your Miro application in the Azure portal.
+To retrieve the needed **Secret Token** contact [Miro Support Team](mailto:support@miro.com). This value will be entered in the Secret Token field in the Provisioning tab of your Miro application in the Azure portal.
## Add Miro from the gallery
Before configuring Miro for automatic user provisioning with Azure AD, you need
![The Azure Active Directory button](common/select-azuread.png)
-2. Go to **Enterprise applications**, and then select **All applications**.
+1. Go to **Enterprise applications**, and then select **All applications**.
![The Enterprise applications blade](common/enterprise-applications.png)
-3. To add a new application, select the **New application** button at the top of the pane.
+1. To add a new application, select the **New application** button at the top of the pane.
![The New application button](common/add-new-app.png)
-4. In the search box, enter **Miro**, select **Miro** in the results panel, and then click the **Add** button to add the application.
+1. In the search box, enter **Miro**, select **Miro** in the results panel, and then click the **Add** button to add the application.
![Miro in the results list](common/search-new-app.png)
Before configuring Miro for automatic user provisioning with Azure AD, you need
This section guides you through the steps to configure the Azure AD provisioning service to create, update, and disable users and/or groups in Miro based on user and/or group assignments in Azure AD. > [!TIP]
-> You may also choose to enable SAML-based single sign-on for Miro, following the instructions provided in the [Miro Single sign-on tutorial](./miro-tutorial.md). Single sign-on can be configured independently of automatic user provisioning, though these two features compliment each other.
+> You may also choose to enable SAML-based single sign-on for Miro, following the instructions provided in the [Miro Single sign-on tutorial](./miro-tutorial.md). Single sign-on can be configured independently of automatic user provisioning, though these two features complement each other.
> [!NOTE] > To learn more about Miro's SCIM endpoint, refer [this](https://help.miro.com/hc/en-us/articles/360036777814).
This section guides you through the steps to configure the Azure AD provisioning
![Enterprise applications blade](common/enterprise-applications.png)
-2. In the applications list, select **Miro**.
+1. In the applications list, select **Miro**.
![The Miro link in the Applications list](common/all-applications.png)
-3. Select the **Provisioning** tab.
+1. Select the **Provisioning** tab.
![Screenshot of the Manage options with the Provisioning option called out.](common/provisioning.png)
-4. Set the **Provisioning Mode** to **Automatic**.
+1. Set the **Provisioning Mode** to **Automatic**.
![Screenshot of the Provisioning Mode dropdown list with the Automatic option called out.](common/provisioning-automatic.png)
-5. Under the **Admin Credentials** section, input `https://miro.com/api/v1/scim` in **Tenant URL**. Input the **SCIM Authentication Token** value retrieved earlier in **Secret Token**. Click **Test Connection** to ensure Azure AD can connect to Miro. If the connection fails, ensure your Miro account has Admin permissions and try again.
+1. Under the **Admin Credentials** section, input `https://miro.com/api/v1/scim` in **Tenant URL**. Input the **SCIM Authentication Token** value retrieved earlier in **Secret Token**. Click **Test Connection** to ensure Azure AD can connect to Miro. If the connection fails, ensure your Miro account has Admin permissions and try again.
![Tenant URL + Token](common/provisioning-testconnection-tenanturltoken.png)
-6. In the **Notification Email** field, enter the email address of a person or group who should receive the provisioning error notifications and check the checkbox - **Send an email notification when a failure occurs**.
+1. In the **Notification Email** field, enter the email address of a person or group who should receive the provisioning error notifications and check the checkbox - **Send an email notification when a failure occurs**.
![Notification Email](common/provisioning-notification-email.png)
-7. Click **Save**.
+1. Click **Save**.
-8. Under the **Mappings** section, select **Synchronize Azure Active Directory Users to Miro**.
+1. Under the **Mappings** section, select **Synchronize Azure Active Directory Users to Miro**.
![Miro User Mappings](media/miro-provisioning-tutorial/usermappings.png)
-9. Review the user attributes that are synchronized from Azure AD to Miro in the **Attribute Mapping** section. The attributes selected as **Matching** properties are used to match the user accounts in Miro for update operations. Select the **Save** button to commit any changes.
+1. Review the user attributes that are synchronized from Azure AD to Miro in the **Attribute Mapping** section. The attributes selected as **Matching** properties are used to match the user accounts in Miro for update operations. Select the **Save** button to commit any changes.
![Miro User Attributes](media/miro-provisioning-tutorial/userattributes.png)
-10. Under the **Mappings** section, select **Synchronize Azure Active Directory Groups to Miro**.
+1. Under the **Mappings** section, select **Synchronize Azure Active Directory Groups to Miro**.
![Miro Group Mappings](media/miro-provisioning-tutorial/groupmappings.png)
-11. Review the group attributes that are synchronized from Azure AD to Miro in the **Attribute Mapping** section. The attributes selected as **Matching** properties are used to match the groups in Miro for update operations. Select the **Save** button to commit any changes. Uncheck **Create** and **Delete** under **Target Object Actions** as Miro SCIM API does not support creating and deleting groups.
+1. Review the group attributes that are synchronized from Azure AD to Miro in the **Attribute Mapping** section. The attributes selected as **Matching** properties are used to match the groups in Miro for update operations. Select the **Save** button to commit any changes. Uncheck **Create** and **Delete** under **Target Object Actions** as Miro SCIM API does not support creating and deleting groups.
![Miro Group Attributes](media/miro-provisioning-tutorial/groupattributes.png)
-12. To configure scoping filters, refer to the following instructions provided in the [Scoping filter tutorial](../app-provisioning/define-conditional-rules-for-provisioning-user-accounts.md).
+1. To configure scoping filters, refer to the following instructions provided in the [Scoping filter tutorial](../app-provisioning/define-conditional-rules-for-provisioning-user-accounts.md).
-13. To enable the Azure AD provisioning service for Miro, change the **Provisioning Status** to **On** in the **Settings** section.
+1. To enable the Azure AD provisioning service for Miro, change the **Provisioning Status** to **On** in the **Settings** section.
![Provisioning Status Toggled On](common/provisioning-toggle-on.png)
-14. Define the users and/or groups that you would like to provision to Miro by choosing the desired values in **Scope** in the **Settings** section.
+1. Define the users and/or groups that you would like to provision to Miro by choosing the desired values in **Scope** in the **Settings** section.
![Provisioning Scope](common/provisioning-scope.png)
-15. When you are ready to provision, click **Save**.
+1. When you are ready to provision, click **Save**.
![Saving Provisioning Configuration](common/provisioning-configuration-save.png)
For more information on how to read the Azure AD provisioning logs, see [Reporti
* Miro's SCIM endpoint does not allow **Create** and **Delete** operations on groups. It only supports group **Update** operation.
+## Troubleshooting Tips
+
+* If experiencing errors with group creation, then it is required to disable it by unchecking **Create** and **Delete** under **Target Object Actions** as Miro SCIM API does not support creating and deleting groups.
+
+ ![Miro Group Tips](media/miro-provisioning-tutorial/groupattributes.png)
+ ## Additional resources * [Managing user account provisioning for Enterprise Apps](../app-provisioning/configure-automatic-user-provisioning-portal.md)
For more information on how to read the Azure AD provisioning logs, see [Reporti
## Next steps
-* [Learn how to review logs and get reports on provisioning activity](../app-provisioning/check-status-user-account-provisioning.md)
+* [Learn how to review logs and get reports on provisioning activity](../app-provisioning/check-status-user-account-provisioning.md)
api-management Api Management Advanced Policies https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/api-management/api-management-advanced-policies.md
This operation level policy does not forward requests to the backend service.
| Attribute | Description | Required | Default | | | -- | -- | - |
-| timeout="integer" | The amount of time in seconds to wait for the HTTP response headers to be returned by the backend service before a timeout error is raised. Minimum value is 0 seconds. Values greater than 240 seconds may not be honored as the underlying network infrastructure can drop idle connections after this time. | No | None |
+| timeout="integer" | The amount of time in seconds to wait for the HTTP response headers to be returned by the backend service before a timeout error is raised. Minimum value is 0 seconds. Values greater than 240 seconds may not be honored as the underlying network infrastructure can drop idle connections after this time. | No | 300 |
| follow-redirects="false &#124; true" | Specifies whether redirects from the backend service are followed by the gateway or returned to the caller. | No | false | | buffer-request-body="false &#124; true" | When set to "true", request is buffered and will be reused on [retry](api-management-advanced-policies.md#Retry). | No | false | | buffer-response="false &#124; true" | Affects processing of chunked responses. When set to "false", each chunk received from the backend is immediately returned to the caller. When set to "true", chunks are buffered (8 KB, unless end of stream is detected) and only then returned to the caller.<br/><br/>Set to "false" with backends such as those implementing [server-sent events (SSE)](how-to-server-sent-events.md) that require content to be returned or streamed immediately to the caller. | No | true |
automation Configure Wuagent https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/automation/update-management/configure-wuagent.md
To configure the automatic downloading of updates without automatically installi
* Windows Server 2016 and later, set to a value of **7**. * Windows Server 2012 R2 and earlier, set to a value of **3**.
-This setting enables downloads of the required updates in the background, and notifies you that the updates are ready to install. In this way, Update Management remains in control of schedules, but allows downloading of updates outside the Update Management maintenance window. This behavior prevents `Maintenance window exceeded` errors in Update Management.
+This setting enables downloads of the required updates in the background, and notifies you that the updates are ready to install. In this way, Update Management remains in control of schedules, but allows downloading of updates outside the Update Management maintenance window. [Learn more](view-update-assessments.md). This behavior prevents `Maintenance window exceeded` errors in Update Management.
You can enable this setting in PowerShell:
$ServiceManager.AddService2($ServiceId,7,"")
## Make WSUS configuration settings
-Update Management supports WSUS settings. You can specify sources for scanning and downloading updates using instructions in [Specify intranet Microsoft Update service location](/windows/deployment/update/waas-wu-settings#specify-intranet-microsoft-update-service-location). By default, the Windows Update client is configured to download updates from Windows Update. When you specify a WSUS server as a source for your machines, if the updates aren't approved in WSUS, update deployment fails.
+Update Management supports WSUS settings. [Learn more](view-update-assessments.md). You can specify sources for scanning and downloading updates using instructions in [Specify intranet Microsoft Update service location](/windows/deployment/update/waas-wu-settings#specify-intranet-microsoft-update-service-location). By default, the Windows Update client is configured to download updates from Windows Update. When you specify a WSUS server as a source for your machines, if the updates aren't approved in WSUS, update deployment fails.
To restrict machines to the internal update service, set [Do not connect to any Windows Update Internet locations](/windows-server/administration/windows-server-update-services/deploy/4-configure-group-policy-settings-for-automatic-updates#do-not-connect-to-any-windows-update-internet-locations).
automation View Update Assessments https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/automation/update-management/view-update-assessments.md
In Update Management, you can view information about your machines, missing updates, update deployments, and scheduled update deployments. You can view the assessment information scoped to the selected Azure virtual machine, from the selected Azure Arc-enabled server, or from the Automation account across all configured machines and servers.
-## Sign in to the Azure portal
+## View update assessment
-Sign in to the [Azure portal](https://portal.azure.com)
+To view update assessment from an Azure VM:
-## View update assessment
+1. Sign in to the [Azure portal](https://portal.azure.com)
+1. Navigate to **Virtual Machines** and select your virtual machine from the list. From the left menu, under **Operations**, select **Updates**, and select **Go to Update Management**.
+
+In Update Management, you can view information about your machine, missing updates, update deployments, manage multiple machines, scheduled update deployments and so on.
+
+[ ![Screenshot of Update Management assessment view for Azure VM.](./media/view-update-assessments/update-assessment-azure-vm.png)](./media/view-update-assessments/update-assessment-azure-vm-expanded.png#lightbox)
-To view update assessment from an Azure VM, navigate to **Virtual Machines** and select your virtual machine from the list. From the left menu, select **Guest + host updates**, and then select **Go to Update Management** on the **Guest + host updates** page.
+To view update assessment from an Azure Arc-enabled server:
-In Update Management, you can view information about your machine, missing updates, update deployments, and scheduled update deployments.
+1. Sign in to the [Azure portal](https://portal.azure.com)
+1. Navigate to **Servers - Azure Arc** and select your server from the list. From the left menu, under **Operation**, select **Guest + host updates** and select **Go to Updates using Update management center**.
-[ ![Update Management assessment view for Azure VM](./media/view-update-assessments/update-assessment-azure-vm.png)](./media/view-update-assessments/update-assessment-azure-vm-expanded.png#lightbox)
+In Update Management, you can view information about your Azure Arc-enabled machine, total updates, assess updates, scheduled update deployments, and so on.
-To view update assessment from an Azure Arc-enabled server, navigate to **Servers - Azure Arc** and select your server from the list. From the left menu, select **Guest and host updates**. On the **Guest + host updates** page, select **Go to Update Management**.
+[ ![Screenshot of Update Management assessment view for Arc-enabled servers.](./media/view-update-assessments/update-assessment-arc-server.png)](./media/view-update-assessments/update-assessment-arc-server-expanded.png#lightbox)
-In Update Management, you can view information about your Azure Arc-enabled machine, missing updates, update deployments, and scheduled update deployments.
+To view update assessment across all machines, including Azure Arc-enabled servers from your Automation account:
-[ ![Update Management assessment view for Arc-enabled servers](./media/view-update-assessments/update-assessment-arc-server.png)](./media/view-update-assessments/update-assessment-arc-server-expanded.png#lightbox)
+1. Sign in to the [Azure portal](https://portal.azure.com)
+1. Navigate to **Automation accounts** and select your Automation account with Update Management enabled from the list. In your Automation account, select **Update management** from the left menu.
-To view update assessment across all machines, including Azure Arc-enabled servers from your Automation account, navigate to **Automation accounts** and select your Automation account with Update Management enabled from the list. In your Automation account, select **Update management** from the left menu.
+The updates for your environment are listed on the **Update management** page. If any updates are identified as missing, a list of them appears in the **Missing updates** tab.
-The updates for your environment are listed on the **Update management** page. If any updates are identified as missing, a list of them is shown on the **Missing updates** tab.
+[ ![Screenshot of Update Management default view.](./media/overview/update-management-view.png)](./media/overview/update-management-view-expanded.png#lightbox)
-[ ![Update Management default view](./media/overview/update-management-view.png)](./media/overview/update-management-view-expanded.png#lightbox)
+- Under the **Compliance** column, you can see the last time the machine was assessed.
+- Under the **Update agent readiness** column, you can see the health of the update agent. If there's an issue, select the link to go to troubleshooting documentation that can help you correct the problem.
+- Under **Information link**, select the link for an update to open the support article that gives you important information about the update.
-Under the **COMPLIANCE** column, you can see the last time the machine was assessed. Under the **UPDATE AGENT READINESS** column, you can see the health of the update agent. If there's an issue, select the link to go to troubleshooting documentation that can help you correct the problem.
+[ ![Screenshot of View update status of Automation account.](./media/view-update-assessments/missing-updates.png)](./media/view-update-assessments/missing-updates-expanded.png#lightbox)
-Under **Information link**, select the link for an update to open the support article that gives you important information about the update.
+The values displayed for each column are:
-[ ![View update status](./media/view-update-assessments/missing-updates.png)](./media/view-update-assessments/missing-updates-expanded.png#lightbox)
+**Field Name** |**Description** |
+ | |
+Machine Name | Name of the machine attached to Update Management.
+Compliance | State of the system's compliance with security and critical updates.
+Update agent readiness | View the health of the update agent. If there's an issue, select the link to go to troubleshooting documentation that can help you correct the problem.|
+Platform | Lists the platform as either Azure or non-Azure.
+Operating system | Lists the operating system as either Windows or Linux.
+Critical missing updates| Count of missing critical updates.
+Security missing updates | Count of missing security updates.
+Other missing updates | Count of non-security and non-critical updates.
+Update approval source | The source of updates. Either Windows update, WSUS, and Microsoft update *applicable to Windows*.
+Windows auto update | Default OS update setting on the machine *applicable to Windows* .
> [!NOTE]
-> Information that is displayed about the Windows Defender definition update status is based on the last data that was summarized from the Log Analytics workspace and might not be current. Review [Windows Defender update always show as missing](../troubleshoot/update-management.md#windows-defender-update-missing-status) to learn more about this behavior.
+> Information that is displayed about the Windows Defender definition update status is based on the last data that was summarized from the Log Analytics workspace and might not be current. Review [Windows Defender update always shows as missing](../troubleshoot/update-management.md#windows-defender-update-missing-status) to learn more about this behavior.
Click anywhere else on the update to open the Log Search pane. The query for the log search is predefined for that specific update. You can modify this query or create your own query to view detailed information.
-[ ![View log query results](./media/view-update-assessments/logsearch-results.png)](./media/view-update-assessments/logsearch-results-expanded.png#lightbox)
+[ ![Screenshot of View log query results of Automation account.](./media/view-update-assessments/logsearch-results.png)](./media/view-update-assessments/logsearch-results-expanded.png#lightbox)
## View missing updates Select **Missing updates** to view the list of updates that are missing from your machines. Each update is listed and can be selected. Information about the number of machines that require the update, operating system details, and a link for more information are all shown. The Log Search pane also shows more details about the updates.
-![Missing Updates](./media/view-update-assessments/automation-view-update-assessments-missing-updates.png)
+![Screenshot of Missing Updates in your Automation account.](./media/view-update-assessments/automation-view-update-assessments-missing-updates.png)
## Work with update classifications
availability-zones Az Region https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/availability-zones/az-region.md
In the Product Catalog, always-available services are listed as "non-regional" s
| **Products** | **Resiliency** | | | | | Azure Active Directory | ![An icon that signifies this service is always available.](media/icon-always-available.svg) |
-| Azure Advanced Threat Protection | ![An icon that signifies this service is always available.](media/icon-always-available.svg) |
+| Microsoft Defender for Identity | ![An icon that signifies this service is always available.](media/icon-always-available.svg) |
| Azure Advisor | ![An icon that signifies this service is always available.](media/icon-always-available.svg) | | Azure Blueprints | ![An icon that signifies this service is always available.](media/icon-always-available.svg) | | Azure Bot Services | ![An icon that signifies this service is always available.](media/icon-always-available.svg) |
azure-monitor Action Groups https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/azure-monitor/alerts/action-groups.md
# Create and manage action groups in the Azure portal
-An action group is a collection of notification preferences defined by the owner of an Azure subscription. Azure Monitor, Service Health and Azure Advisor alerts use action groups to notify users that an alert has been triggered. Various alerts may use the same action group or different action groups depending on the user's requirements.
+An action group is a collection of notification preferences defined by the owner of an Azure subscription. Azure Monitor, Service Health and Azure Advisor alerts use action groups to notify users that an alert has been triggered. Various alerts may use the same action group or different action groups depending on the user's requirements.
This article shows you how to create and manage action groups in the Azure portal.
Each action is made up of the following properties:
For information on how to use Azure Resource Manager templates to configure action groups, see [Action group Resource Manager templates](./action-groups-create-resource-manager-template.md).
-Action Group is **Global** service, therefore there's no dependency on a specific Azure region. Requests from client can be processed by action group service in any region, which means, if one region of service is down, the traffic will be routed and process by other regions automatically. Being a *global service* it helps client not to worry about **disaster recovery**.
+Action Group is **Global** service, therefore there's no dependency on a specific Azure region. Requests from client can be processed by action group service in any region, which means, if one region of service is down, the traffic will be routed and process by other regions automatically. Being a *global service* it helps client not to worry about **disaster recovery**.
## Create an action group by using the Azure portal
Action Group is **Global** service, therefore there's no dependency on a specifi
1. Select **Alerts**, then select **Manage actions**. ![Manage Actions button](./media/action-groups/manage-action-groups.png)
-
+ 1. Select **Add action group**, and fill in the relevant fields in the wizard experience. ![The "Add action group" command](./media/action-groups/add-action-group.PNG)
Under **Instance details**:
a. **Notification type**: Select the type of notification you want to send. The available options are: * Email Azure Resource Manager Role - Send an email to users assigned to certain subscription-level ARM roles. * Email/SMS/Push/Voice - Send these notification types to specific recipients.
-
+ b. **Name**: Enter a unique name for the notification. c. **Details**: Based on the selected notification type, enter an email address, phone number, etc.
-
+ d. **Common alert schema**: You can choose to enable the [common alert schema](./alerts-common-schema.md), which provides the advantage of having a single extensible and unified alert payload across all the alert services in Azure Monitor. ![The Notifications tab](./media/action-groups/action-group-2-notifications.png)
-
+ ### Configure actions 1. Click the **Next: Actions >** button to move to the **Actions** tab, or select the **Actions** tab at the top of the screen.
Under **Instance details**:
1. Define a list of actions to trigger when an alert is triggered. Provide the following for each action: a. **Action type**: Select Automation Runbook, Azure Function, ITSM, Logic App, Secure Webhook, Webhook.
-
+ b. **Name**: Enter a unique name for the action. c. **Details**: Based on the action type, enter a webhook URI, Azure app, ITSM connection, or Automation Runbook. For ITSM Action, additionally specify **Work Item** and other fields your ITSM tool requires.
-
+ d. **Common alert schema**: You can choose to enable the [common alert schema](./alerts-common-schema.md), which provides the advantage of having a single extensible and unified alert payload across all the alert services in Azure Monitor.
-
+ ![The Actions tab](./media/action-groups/action-group-3-actions.png) ### Create the action group
Under **Instance details**:
1. You can explore the **Tags** settings if you like. This lets you associate key/value pairs to the action group for your categorization and is a feature available for any Azure resource. ![The Tags tab](./media/action-groups/action-group-4-tags.png)
-
+ 1. Click **Review + create** to review the settings. This will do a quick validation of your inputs to make sure all the required fields are selected. If there are issues, they'll be reported here. Once you've reviewed the settings, click **Create** to provision the action group.
-
+ ![The Review + create tab](./media/action-groups/action-group-5-review.png) > [!NOTE]
When creating or updating an action group in the Azure portal, you can **test**
1. After creating an action rule, click on **Review + create**. Select *Test action group*. ![The Test Action Group](./media/action-groups/test-action-group.png)
-
+ 1. Select the *sample type* and select the notification and action types that you want to test and select **Test**.
-
+ ![Select Sample Type + notification + action type](./media/action-groups/test-sample-action-group.png)
-1. If you close the window or select **Back to test setup** while the test is running, the test is stopped, and you won't get test results.
+1. If you close the window or select **Back to test setup** while the test is running, the test is stopped, and you won't get test results.
![Stop running test](./media/action-groups/stop-running-test.png)
-1. When the test is complete either a **Success** or **Failed** test status is displayed. If the test failed, you could select *View details* to get more information.
+1. When the test is complete either a **Success** or **Failed** test status is displayed. If the test failed, you could select *View details* to get more information.
![Test sample failed](./media/action-groups/test-sample-failed.png) You can use the information in the **Error details section**, to understand the issue so that you can edit and test the action group again. To allow you to check the action groups are working as expected before you enable them in a production environment, you'll get email and SMS alerts with the subject: Test.
-All the details and links in Test email notifications for the alerts fired are a sample set for reference.
+All the details and links in Test email notifications for the alerts fired are a sample set for reference.
> [!NOTE] > You may have a limited number of actions in a test Action Group. See the [rate limiting information](./alerts-rate-limiting.md) article.
After you create an action group, you can view **Action groups** by selecting **
## Action-specific information > [!NOTE]
-> See [Subscription Service Limits for Monitoring](../../azure-resource-manager/management/azure-subscription-service-limits.md#azure-monitor-limits) for numeric limits on each of the items below.
+> See [Subscription Service Limits for Monitoring](../../azure-resource-manager/management/azure-subscription-service-limits.md#azure-monitor-limits) for numeric limits on each of the items below.
### Automation Runbook Refer to the [Azure subscription service limits](../../azure-resource-manager/management/azure-subscription-service-limits.md) for limits on Runbook payloads.
-You may have a limited number of Runbook actions in an Action Group.
+You may have a limited number of Runbook actions in an Action Group.
### Azure app Push Notifications Enable push notifications to the [Azure mobile app](https://azure.microsoft.com/features/azure-portal/mobile-app/) by providing the email address you use as your account ID when configuring the Azure mobile app.
You may have a limited number of email actions in an Action Group. See the [rate
While setting up *Email ARM Role*, you need to make sure below three conditions are met:
-1. The type of the entity being assigned to the role needs to be **ΓÇ£UserΓÇ¥**.
+1. The type of the entity being assigned to the role needs to be **"User"**.
2. The assignment needs to be done at the **subscription** level.
-3. The user needs to have an email configured in their **AAD profile**.
+3. The user needs to have an email configured in their **AAD profile**.
> [!NOTE] > It can take upto **24 hours** for customer to start receiving notifications after they add new ARM Role to their subscription.
You may have a limited number of Function actions in an Action Group.
### ITSM ITSM Action requires an ITSM Connection. Learn how to create an [ITSM Connection](./itsmc-overview.md).
-You may have a limited number of ITSM actions in an Action Group.
+You may have a limited number of ITSM actions in an Action Group.
### Logic App You may have a limited number of Logic App actions in an Action Group.
The Action Groups Secure Webhook action enables you to take advantage of Azure A
> If the webhook endpoint is expecting a specific schema (for example Microsoft Teams) you should use the Logic App action to transform the alert schema to meet the target webhook's expectations. 1. Create an Azure AD Application for your protected web API. See [Protected web API: App registration](../../active-directory/develop/scenario-protected-web-api-app-registration.md).
- - Configure your protected API to be [called by a daemon app](../../active-directory/develop/scenario-protected-web-api-app-registration.md#if-your-web-api-is-called-by-a-daemon-app).
-
+ - Configure your protected API to be [called by a daemon app](../../active-directory/develop/scenario-protected-web-api-app-registration.md#if-your-web-api-is-called-by-a-service-or-daemon-app).
+ > [!NOTE] > Your protected web API must be configured to [accept V2.0 access tokens](../../active-directory/develop/reference-app-manifest.md#accesstokenacceptedversion-attribute).
-
+ 2. Enable Action Group to use your Azure AD Application. > [!NOTE] > You must be a member of the [Azure AD Application Administrator role](../../active-directory/roles/permissions-reference.md#all-roles) to execute this script.
-
+ - Modify the PowerShell script's Connect-AzureAD call to use your Azure AD Tenant ID. - Modify the PowerShell script's variable $myAzureADApplicationObjectId to use the Object ID of your Azure AD Application. - Run the modified script. > [!NOTE] > Service principle need to be a member of **owner role** of Azure AD application to be able to create or modify the Secure Webhook action in the action group.
-
+ 3. Configure the Action Group Secure Webhook action. - Copy the value $myApp.ObjectId from the script and enter it in the Application Object ID field in the Webhook action definition.
-
+ ![Secure Webhook action](./media/action-groups/action-groups-secure-webhook.png) #### Secure Webhook PowerShell Script ```PowerShell Connect-AzureAD -TenantId "<provide your Azure AD tenant ID here>"
-
-# This is your Azure AD Application's ObjectId.
+
+# This is your Azure AD Application's ObjectId.
$myAzureADApplicationObjectId = "<the Object ID of your Azure AD Application>"
-
+ # This is the Action Group Azure AD AppId $actionGroupsAppId = "461e8683-5575-4561-ac7f-899cc907d62a"
-
+ # This is the name of the new role we will add to your Azure AD Application $actionGroupRoleName = "ActionGroupsSecureWebhook"
-
+ # Create an application role of given name and description Function CreateAppRole([string] $Name, [string] $Description) {
Function CreateAppRole([string] $Name, [string] $Description)
$appRole.Value = $Name; return $appRole }
-
+ # Get my Azure AD Application, it's roles and service principal $myApp = Get-AzureADApplication -ObjectId $myAzureADApplicationObjectId $myAppRoles = $myApp.AppRoles
$actionGroupsSP = Get-AzureADServicePrincipal -Filter ("appId eq '" + $actionGro
Write-Host "App Roles before addition of new role.." Write-Host $myAppRoles
-
+ # Create the role if it doesn't exist if ($myAppRoles -match "ActionGroupsSecureWebhook") {
if ($myAppRoles -match "ActionGroupsSecureWebhook")
else { $myServicePrincipal = Get-AzureADServicePrincipal -Filter ("appId eq '" + $myApp.AppId + "'")
-
+ # Add our new role to the Azure AD Application $newRole = CreateAppRole -Name $actionGroupRoleName -Description "This is a role for Action Group to join" $myAppRoles.Add($newRole) Set-AzureADApplication -ObjectId $myApp.ObjectId -AppRoles $myAppRoles }
-
+ # Create the service principal if it doesn't exist if ($actionGroupsSP -match "AzNS AAD Webhook") {
else
# Create a service principal for the Action Group Azure AD Application and add it to the role $actionGroupsSP = New-AzureADServicePrincipal -AppId $actionGroupsAppId }
-
+ New-AzureADServiceAppRoleAssignment -Id $myApp.AppRoles[0].Id -ResourceId $myServicePrincipal.ObjectId -ObjectId $actionGroupsSP.ObjectId -PrincipalId $actionGroupsSP.ObjectId
-
+ Write-Host "My Azure AD Application (ObjectId): " + $myApp.ObjectId Write-Host "My Azure AD Application's Roles" Write-Host $myApp.AppRoles ``` ### SMS
-See the [rate limiting information](./alerts-rate-limiting.md) and [SMS alert behavior](./alerts-sms-behavior.md) for additional important information.
+See the [rate limiting information](./alerts-rate-limiting.md) and [SMS alert behavior](./alerts-sms-behavior.md) for additional important information.
You may have a limited number of SMS actions in an Action Group. > [!NOTE]
-> If the Azure portal Action Group user interface does not let you select your country/region code, then SMS is not supported for your country/region. If your country/region code is not available, you can vote to have your country/region added at [user voice](https://feedback.azure.com/d365community/idea/e527eaa6-2025-ec11-b6e6-000d3a4f09d0). In the meantime, a work around is to have your Action Group call a webhook to a third-party SMS provider with support in your country/region.
+> If the Azure portal Action Group user interface does not let you select your country/region code, then SMS is not supported for your country/region. If your country/region code is not available, you can vote to have your country/region added at [user voice](https://feedback.azure.com/d365community/idea/e527eaa6-2025-ec11-b6e6-000d3a4f09d0). In the meantime, a work around is to have your Action Group call a webhook to a third-party SMS provider with support in your country/region.
Pricing for supported countries/regions is listed in the [Azure Monitor pricing page](https://azure.microsoft.com/pricing/details/monitor/).
Pricing for supported countries/regions is listed in the [Azure Monitor pricing
| 43 | Austria | | 32 | Belgium | | 55 | Brazil |
-| 1 |Canada |
+| 1 |Canada |
| 56 | Chile | | 86 | China | | 420 | Czech Republic |
See the [rate limiting information](./alerts-rate-limiting.md) article for addit
You may have a limited number of Voice actions in an Action Group. > [!NOTE]
-> If the Azure portal Action Group user interface does not let you select your country/region code, then voice calls are not supported for your country/region. If your country/region code is not available, you can vote to have your country/region added at [user voice](https://feedback.azure.com/d365community/idea/e527eaa6-2025-ec11-b6e6-000d3a4f09d0). In the meantime, a work around is to have your Action Group call a webhook to a third-party voice call provider with support in your country/region.
-> Only Country code supported today in Azure portal Action Group for Voice Notification is +1(United States).
+> If the Azure portal Action Group user interface does not let you select your country/region code, then voice calls are not supported for your country/region. If your country/region code is not available, you can vote to have your country/region added at [user voice](https://feedback.azure.com/d365community/idea/e527eaa6-2025-ec11-b6e6-000d3a4f09d0). In the meantime, a work around is to have your Action Group call a webhook to a third-party voice call provider with support in your country/region.
+> Only Country code supported today in Azure portal Action Group for Voice Notification is +1(United States).
Pricing for supported countries/regions is listed in the [Azure Monitor pricing page](https://azure.microsoft.com/pricing/details/monitor/).
Please see [Action Group IP Addresses](../app/ip-addresses.md) for source IP add
## Next steps
-* Learn more about [SMS alert behavior](./alerts-sms-behavior.md).
-* Gain an [understanding of the activity log alert webhook schema](./activity-log-alerts-webhook.md).
+* Learn more about [SMS alert behavior](./alerts-sms-behavior.md).
+* Gain an [understanding of the activity log alert webhook schema](./activity-log-alerts-webhook.md).
* Learn more about [ITSM Connector](./itsmc-overview.md). * Learn more about [rate limiting](./alerts-rate-limiting.md) on alerts.
-* Get an [overview of activity log alerts](./alerts-overview.md), and learn how to receive alerts.
+* Get an [overview of activity log alerts](./alerts-overview.md), and learn how to receive alerts.
* Learn how to [configure alerts whenever a service health notification is posted](../../service-health/alerts-activity-log-service-notifications-portal.md).
azure-monitor Basic Logs Configure https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/azure-monitor/logs/basic-logs-configure.md
Title: Configure Basic Logs in Azure Monitor (Preview) description: Configure a table for Basic Logs in Azure Monitor. Previously updated : 01/13/2022 Last updated : 05/15/2022
Last updated 01/13/2022
Setting a table's [log data plan](log-analytics-workspace-overview.md#log-data-plans-preview) to *Basic Logs* lets you save on the cost of storing high-volume verbose logs you use for debugging, troubleshooting and auditing, but not for analytics and alerts. This article describes how to configure Basic Logs for a particular table in your Log Analytics workspace. > [!IMPORTANT]
-> You can switch plans once a week.
+> You can switch a table's plan once a week. The Basic Logs feature is not available for workspaces in [legacy pricing tiers](cost-logs.md#legacy-pricing-tiers).
## Which tables support Basic Logs? All tables in your Log Analytics are Analytics tables, by default. You can configure particular tables to use Basic Logs. You can't configure a table for Basic Logs if Azure Monitor relies on that table for specific features.
Basic Logs tables retain data for eight days. When you change an existing table'
## Next steps - [Learn more about the different log plans.](log-analytics-workspace-overview.md#log-data-plans-preview)-- [Query data in Basic Logs.](basic-logs-query.md)
+- [Query data in Basic Logs.](basic-logs-query.md)
azure-monitor Cost Logs https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/azure-monitor/logs/cost-logs.md
The count of monitored servers is calculated on an hourly granularity. The daily
## Legacy pricing tiers Subscriptions that contained a Log Analytics workspace or Application Insights resource on April 2, 2018, or are linked to an Enterprise Agreement that started before February 1, 2019 and is still active, will continue to have access to use the the following legacy pricing tiers: -- Free Trial - Standalone (Per GB) - Per Node (OMS)
+Access to the legacy Free Trial pricing tier will be further limited starting July 1, 2022 (see below.)
+ ### Free Trial pricing tier
-Workspaces in the **Free Trial** pricing tier will have daily data ingestion limited to 500 MB (except for security data types collected by [Microsoft Defender for Cloud](../../security-center/index.yml)), and the data retention is limited to seven days. The Free Trial pricing tier is intended only for evaluation purposes. No SLA is provided for the Free tier. Workspaces in the Standalone or Per Node pricing tiers have user-configurable retention from 30 to 730 days. Creating new workspaces in (or moving existing workspaces into) the Free Trial pricing tier is possible until July 1, 2022.
+Workspaces in the **Free Trial** pricing tier will have daily data ingestion limited to 500 MB (except for security data types collected by [Microsoft Defender for Cloud](../../security-center/index.yml)), and the data retention is limited to seven days. The Free Trial pricing tier is intended only for evaluation purposes. No SLA is provided for the Free tier.
+
+> [!NOTE]
+> Creating new workspaces in, or moving existing workspaces into, the legacy Free Trial pricing tier is possible only until July 1, 2022.
### Standalone pricing tier
-Usage on the **Standalone** pricing tier is billed by the ingested data volume. It is reported in the **Log Analytics** service and the meter is named "Data Analyzed".
+Usage on the **Standalone** pricing tier is billed by the ingested data volume. It is reported in the **Log Analytics** service and the meter is named "Data Analyzed". Workspaces in the Standalone pricing tier have user-configurable retention from 30 to 730 days. Workspaces in the Standalone pricing tier do not support the use of [Basic Logs](basic-logs-configure.md).
### Per Node pricing tier
-The **Per Node** pricing tier charges per monitored VM (node) on an hour granularity. For each monitored node, the workspace is allocated 500 MB of data per day that's not billed. This allocation is calculated with hourly granularity and is aggregated at the workspace level each day. Data ingested above the aggregate daily data allocation is billed per GB as data overage. On your bill, the service will be **Insight and Analytics** for Log Analytics usage if the workspace is in the Per Node pricing tier. Usage is reported on three meters:
+The **Per Node** pricing tier charges per monitored VM (node) on an hour granularity. For each monitored node, the workspace is allocated 500 MB of data per day that's not billed. This allocation is calculated with hourly granularity and is aggregated at the workspace level each day. Data ingested above the aggregate daily data allocation is billed per GB as data overage. On your bill, the service will be **Insight and Analytics** for Log Analytics usage if the workspace is in the Per Node pricing tier. Workspaces in the Per Node pricing tier have user-configurable retention from 30 to 730 days. Workspaces in the Per Node pricing tier do not support the use of [Basic Logs](basic-logs-configure.md). Usage is reported on three meters:
- **Node**: this is usage for the number of monitored nodes (VMs) in units of node months. - **Data Overage per Node**: this is the number of GB of data ingested in excess of the aggregated data allocation.
The **Per Node** pricing tier charges per monitored VM (node) on an hour granula
> [!TIP] > If your workspace has access to the **Per Node** pricing tier but you're wondering whether it would cost less in a Pay-As-You-Go tier, you can [use the query below](#evaluate-the-legacy-per-node-pricing-tier) for a recommendation.
-Workspaces created before April 2016 can continue to use the **Standard** and **Premium** pricing tiers that have fixed data retention of 30 days and 365 days, respectively. New workspaces can't be created in the **Standard** or **Premium** pricing tiers, and if a workspace is moved out of these tiers, it can't be moved back. Data ingestion meters on your Azure bill for these legacy tiers are called "Data analyzed."
+### Standard and Premium pricing tiers
+Workspaces created before April 2016 can continue to use the **Standard** and **Premium** pricing tiers that have fixed data retention of 30 days and 365 days, respectively. New workspaces can't be created in the **Standard** or **Premium** pricing tiers, and if a workspace is moved out of these tiers, it can't be moved back. Workspaces in these pricing tiers do not support the use of [Basic Logs](basic-logs-configure.md). Data ingestion meters on your Azure bill for these legacy tiers are called "Data analyzed."
### Microsoft Defender for Cloud with legacy pricing tiers Following are considerations between legacy Log Analytics tiers and how usage is billed for [Microsoft Defender for Cloud](../../security-center/index.yml).
azure-monitor Log Analytics Workspace Overview https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/azure-monitor/logs/log-analytics-workspace-overview.md
Title: Log Analytics workspace overview
description: Overview of Log Analytics workspace which store data for Azure Monitor Logs. na Previously updated : 02/18/2022 Last updated : 05/15/2022 # Log Analytics workspace overview
By default, all tables in a workspace are **Analytics** tables, which are availa
The following table gives a brief summary of the two plans. See [Configure Basic Logs in Azure Monitor (Preview)](basic-logs-configure.md) for more details on Basic Logs and how to configure them. > [!NOTE]
-> Basic Logs are currently in public preview. You can currently work with Basic Logs tables in the Azure Portal and using a limited number of other components.
+> Basic Logs are currently in public preview. You can currently work with Basic Logs tables in the Azure Portal and using a limited number of other components. The Basic Logs feature is not available for workspaces in [legacy pricing tiers](cost-logs.md#legacy-pricing-tiers).
The following table summarizes the differences between the plans.
container-apps Containers https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/container-apps/containers.md
Previously updated : 02/18/2022 Last updated : 05/12/2022 # Containers in Azure Container Apps Preview
-Azure Container Apps manages the details of Kubernetes and container orchestrations for you. Containers in Azure Container Apps can use any runtime, programming language, or development stack of your choice.
+Azure Container Apps manages the details of Kubernetes and container orchestration for you. Containers in Azure Container Apps can use any runtime, programming language, or development stack of your choice.
:::image type="content" source="media/containers/azure-container-apps-containers.png" alt-text="Azure Container Apps: Containers":::
Azure Container Apps supports:
- Any Linux-based x86-64 (`linux/amd64`) container image - Containers from any public or private container registry
-Additional features include:
+Features include:
-- There is no required base container image.-- Changes to the `template` ARM configuration section triggers a new [container app revision](application-lifecycle-management.md).
+- There's no required base container image.
+- Changes to the `template` ARM configuration section trigger a new [container app revision](application-lifecycle-management.md).
- If a container crashes, it automatically restarts. > [!NOTE]
Additional features include:
## Configuration
-The following example configuration shows the options available when setting up a container.
+Below is an example of the `containers` array in the [`properties.template`](azure-resource-manager-api-spec.md#propertiestemplate) section of a container app resource template. The excerpt shows the available configuration options when setting up a container.
```json
-{
- ...
- "template": {
- "containers": [
+"containers": [
+ {
+ "name": "main",
+ "image": "[parameters('container_image')]",
+ "env": [
{
- "image": "myacr.azurecr.io/myrepo/api-service:v1",
- "name": "my-container-image",
- "command": ["/bin/queue"],
- "args": [],
- "env": [
- {
- "name": "HTTP_PORT",
- "value": "8080"
- }
- ],
- "resources": {
- "cpu": 0.75,
- "memory": "1.5Gi"
- }
- }]
+ "name": "HTTP_PORT",
+ "value": "80"
+ },
+ {
+ "name": "SECRET_VAL",
+ "secretRef": "mysecret"
+ }
+ ],
+ "resources": {
+ "cpu": 0.5,
+ "memory": "1Gi"
+ },
+ "volumeMounts": [
+ {
+ "mountPath": "/myfiles",
+ "volumeName": "azure-files-volume"
+ }
+ ]
+ "probes":[
+ {
+ "type":"liveness",
+ "httpGet":{
+ "path":"/health",
+ "port":8080,
+ "httpHeaders":[
+ {
+ "name":"Custom-Header",
+ "value":"liveness probe"
+ }]
+ },
+ "initialDelaySeconds":7,
+ "periodSeconds":3
+ },
+ {
+ "type":"readiness",
+ "tcpSocket":
+ {
+ "port": 8081
+ },
+ "initialDelaySeconds": 10,
+ "periodSeconds": 3
+ },
+ {
+ "type": "startup",
+ "httpGet": {
+ "path": "/startup",
+ "port": 8080,
+ "httpHeaders": [
+ {
+ "name": "Custom-Header",
+ "value": "startup probe"
+ }]
+ },
+ "initialDelaySeconds": 3,
+ "periodSeconds": 3
+ }]
}
-}
+],
+ ``` | Setting | Description | Remarks |
The following example configuration shows the options available when setting up
| `env` | An array of key/value pairs that define environment variables. | Use `secretRef` instead of the `value` field to refer to a secret. | | `resources.cpu` | The number of CPUs allocated to the container. | Values must adhere to the following rules: the value must be greater than zero and less than or equal to 2, and can be any decimal number, with a maximum of two decimal places. For example, `1.25` is valid, but `1.555` is invalid. The default is 0.5 CPU per container. | | `resources.memory` | The amount of RAM allocated to the container. | This value is up to `4Gi`. The only allowed units are [gibibytes](https://simple.wikipedia.org/wiki/Gibibyte) (`Gi`). Values must adhere to the following rules: the value must be greater than zero and less than or equal to `4Gi`, and can be any decimal number, with a maximum of two decimal places. For example, `1.25Gi` is valid, but `1.555Gi` is invalid. The default is `1Gi` per container. |
+| `volumeMounts` | An array of volume mount definitions. | You can define a temporary volume or multiple permanent storage volumes for your container. For more information about storage volumes, see [Use storage mounts in Azure Container Apps](storage-mounts.md).|
+| `probes`| An array of health probes enabled in the container. | This feature is based on Kubernetes health probes. For more information about probes settings, see [Health probes in Azure Container Apps](health-probes.md).|
+
-The total amount of CPUs and memory requested for all the containers in a container app must add up to one of the following combinations.
+When allocating resources, the total amount of CPUs and memory requested for all the containers in a container app must add up to one of the following combinations.
| vCPUs (cores) | Memory | |||
The total amount of CPUs and memory requested for all the containers in a contai
| `1.75` | `3.5Gi` | | `2.0` | `4.0Gi` | -- All of the CPU requests in all of your containers must match one of the values in the vCPUs column.-- All of the memory requests in all your containers must match the memory value in the memory column in the same row of the CPU column.
+- The total of the CPU requests in all of your containers must match one of the values in the vCPUs column.
+- The total of the memory requests in all your containers must match the memory value in the memory column in the same row of the CPU column.
## Multiple containers
-You can define multiple containers in a single container app. Groups of containers are known as [pods](https://kubernetes.io/docs/concepts/workloads/pods). The containers in a pod share hard disk and network resources and experience the same [application lifecycle](application-lifecycle-management.md).
+You can define multiple containers in a single container app. The containers in a container app share hard disk and network resources and experience the same [application lifecycle](application-lifecycle-management.md).
-You run multiple containers together by defining more than one container in the configuration's `containers` array.
+To run multiple containers in a container app, add more than one container in the `containers` array of the container app template.
-Reasons to run containers together in a pod include:
+Reasons to run containers together in a container app include:
- Use a container as a sidecar to your primary app.-- Use of a shared disk space and virtual network.
+- Share disk space and the same virtual network.
- Share scale rules among containers.-- Group together multiple containers that need to always run together.-- Enable direct communication among containers on the same host.
+- Group multiple containers that need to always run together.
+- Enable direct communication among containers.
## Container registries
-You can deploy images hosted on private registries where credentials are provided through the Container Apps configuration.
+You can deploy images hosted on private registries by providing credentials in the Container Apps configuration.
-To use a container registry, you first define the required fields to the [configuration's](azure-resource-manager-api-spec.md) `registries` section.
+To use a container registry, you define the required fields in `registries` array in the [`properties.configuration`](azure-resource-manager-api-spec.md) section of the container app resource template. The `passwordSecretRef` field identifies the name of the secret in the `secrets` array name where you defined the password.
```json {
To use a container registry, you first define the required fields to the [config
"registries": [{ "server": "docker.io", "username": "my-registry-user-name",
- "passwordSecretRef": "my-password-secretref-name"
+ "passwordSecretRef": "my-password-secret-name"
}] } ```
-With this set up, the saved credentials can be used when you reference a container image in an `image` in the `containers` array.
+With the registry information setup, the saved credentials can be used to pull a container image from the private registry when your app is deployed.
-The following example shows how to deploy an app from the Azure Container Registry.
+The following example shows how to configure Azure Container Registry credentials in a container app.
```json {
The following example shows how to deploy an app from the Azure Container Regist
"value": "my-acr-password" } ],
+...
"registries": [ { "server": "myacr.azurecr.io",
container-apps Microservices https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/container-apps/microservices.md
:::image type="content" source="media/microservices/azure-container-services-microservices.png" alt-text="Container apps are deployed as microservices.":::
-A Container Apps [environment](environment.md) provides a security boundary around a group of container apps. A single container app typically represents a microservice, which is composed of pods made up of one or more [containers](containers.md).
+A Container Apps [environment](environment.md) provides a security boundary around a group of container apps. A single container app typically represents a microservice, which is composed of container apps made up of one or more [containers](containers.md).
## Dapr integration
container-apps Revisions https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/container-apps/revisions.md
Title: Revisions in Azure Container Apps Preview
-description: Learn how revisions are created in Azure Container Apps
+description: Learn about revisions in Azure Container Apps
Previously updated : 11/02/2021 Last updated : 05/11/2022 # Revisions in Azure Container Apps Preview
-A revision is an immutable snapshot of a container app.
+Azure Container Apps implements container app versioning by creating revisions. A revision is an immutable snapshot of a container app version.
- The first revision is automatically created when you deploy your container app.-- New revisions are automatically created when a container app's `template` configuration changes.-- While revisions are immutable, they're affected by changes to global configuration values, which apply to all revisions.
+- New revisions are automatically created when you make a [*revision-scope*](#revision-scope-changes) change to your container app.
+- While revisions are immutable, they're affected by [*application-scope*](#application-scope-changes) changes, which apply to all revisions.
+- You can retain up to 100 revisions, giving you a historical record of your container app updates.
+- You can run multiple revisions concurrently.
+- You can split external HTTP traffic between active revisions.
:::image type="content" source="media/revisions/azure-container-apps-revisions.png" alt-text="Azure Container Apps: Containers":::
-Revisions are most useful when you enable [ingress](ingress.md) to make your container app accessible via HTTP. Revisions are often used when you want to direct traffic from one snapshot of your container app to the next. Typical traffic direction strategies include [A/B testing](https://wikipedia.org/wiki/A/B_testing) and [BlueGreen deployment](https://martinfowler.com/bliki/BlueGreenDeployment.html).
+
+## Use cases
+
+Container Apps revisions help you manage the release of updates to your container app by creating a new revision each time you make a *revision-scope* change to your app. You can control which revisions are active, and the external traffic that is routed to each active revision.
+
+You can use revisions to:
+
+- Release a new version of your app.
+- Quickly revert to an earlier version of your app.
+- Split traffic between revisions for [A/B testing](https://wikipedia.org/wiki/A/B_testing).
+- Gradually phase in a new revision in blue-green deployments. For more information about blue-green deployment, see [BlueGreenDeployment](https://martinfowler.com/bliki/BlueGreenDeployment.html).
The following diagram shows a container app with two revisions. :::image type="content" source="media/revisions/azure-container-apps-revisions-traffic-split.png" alt-text="Azure Container Apps: Traffic splitting among revisions":::
-The scenario shown above presumes the container app is in following state:
+The scenario shown above presumes the container app is in the following state:
-- [Ingress](ingress.md) is enabled, which makes the container app available via HTTP.-- The first revision is deployed as _Revision 1_.
+- [Ingress](ingress.md) is enabled, making the container app available via HTTP.
+- The first revision was deployed as _Revision 1_.
- After the container was updated, a new revision was activated as _Revision 2_.-- [Traffic splitting](revisions-manage.md#traffic-splitting) rules are configured so that _Revision 1_ receives 80% of the requests, while _Revision 2_ receives the remaining 20%.
+- [Traffic splitting](revisions-manage.md#traffic-splitting) rules are configured so that _Revision 1_ receives 80% of the requests, and _Revision 2_ receives the remaining 20%.
+
+## Revision name suffix
+
+Revision names are used to identify a revision, and in the revision's URL. You can customize the revision name by setting the revision suffix.
+
+The format of a revision name is:
+
+```text
+<container app name>--<revision suffix>
+```
+
+By default, Container Apps creates a unique revision name with a suffix consisting of a semi-random string of alphanumeric characters. You can customize the name by setting a unique custom revision suffix.
+
+For example, for a container app named *album-api*, setting the revision suffix name to *1st-revision* would create a revision with the name *album-api--1st-revision*.
+
+You can set the revision suffix in the [ARM template](azure-resource-manager-api-spec.md#propertiestemplate), through the Azure CLI `az containerapp create` and `az containerapp update` commands, or when creating a revision via the Azure portal.
## Change types
-Changes made to a container app fall under one of two categories: *revision-scope* and *application-scope* changes. Revision-scope changes are any change that triggers a new revision, while application-scope changes don't create revisions.
+Changes to a container app fall under two categories: *revision-scope* or *application-scope* changes. *Revision-scope* changes trigger a new revision when you deploy your app, while *application-scope* changes don't.
### Revision-scope changes
-The following types of changes create a new revision:
+A new revision is created when a container app is updated with *revision-scope* changes. The changes are limited to the revision in which they're deployed, and don't affect other revisions.
+
+A *revision-scope* change is any change to the parameters in the [`properties.template`](azure-resource-manager-api-spec.md#propertiestemplate) section of the container app resource template.
-- Changes to containers-- Add or update scaling rules-- Changes to Dapr settings-- Any change that affects the `template` section of the configuration
+These parameters include:
+
+- [Revision suffix](#revision-name-suffix)
+- Container configuration and images
+- Scale rules for the container application
### Application-scope changes
-The following types of changes do not create a new revision:
+When you deploy a container app with *application-scope* changes:
+
+- The changes are globally applied to all revisions.
+- A new revision isn't created.
+
+*Application-scope* changes are defined as any change to the parameters in the [`properties.configuration`](azure-resource-manager-api-spec.md#propertiesconfiguration) section of the container app resource template.
+
+These parameters include:
+
+- [Secret values](manage-secrets.md) (revisions must be restarted before a container recognizes new secret values)
+- [Revision mode](#revision-modes)
+- Ingress configuration including:
+ - Turning [ingress](ingress.md) on or off
+ - [Traffic splitting rules](revisions-manage.md#traffic-splitting)
+ - Labels
+- Credentials for private container registries
+- Dapr settings
+ -- Changes to [traffic splitting rules](revisions-manage.md#traffic-splitting)-- Turning [ingress](ingress.md) on or off-- Changes to [secret values](manage-secrets.md)-- Any change outside the `template` section of the configuration
+## Revision modes
-While changes to secrets are an application-scope change, revisions must be [restarted](revisions.md) before a container recognizes new secret values.
+The revision mode controls whether only a single revision or multiple revisions of your container app can be simultaneously active. You can set your app's revision mode from your container app's **Revision management** page in the Azure portal, using Azure CLI commands, or in the ARM template.
+
+### Single revision mode
+
+By default, a container app is in *single revision mode*. In this mode, only one revision is active at a time. When a new revision is created, the latest revision replaces the active revision.
+
+### Multiple revision mode
+
+Set the revision mode to *multiple revision mode*, to run multiple revisions of your app simultaneously. While in this mode, new revisions are activated alongside current active revisions.
+
+For an app implementing external HTTP ingress, you can control the percentage of traffic going to each active revision from your container app's **Revision management** page in the Azure portal, using Azure CLI commands, or in an ARM template. For more information, see [Traffic splitting](revisions-manage.md#traffic-splitting).
+
+## Revision Labels
+
+For container apps with external HTTP traffic, labels are a portable means to direct traffic to specific revisions. A label provides a unique URL that you can use to route traffic to the revision that the label is assigned. To switch traffic between revisions, you can move the label from one revision to another.
+
+- Labels keep the same URL when moved from one revision to another.
+- A label can be applied to only one revision at a time.
+- Allocation for traffic splitting isn't required for revisions with labels.
+- Labels are most useful when the app is in *multiple revision mode*.
+- You can enable labels, traffic splitting or both.
+
+Labels are useful for testing new revisions. For example, when you want to give access to a set of test users, you can give them the label's URL. Then when you want to move your users to a different revision, you can move the label to that revision.
+
+Labels work independently of traffic splitting. Traffic splitting distributes traffic going to the container app's application URL to revisions based on the percentage of traffic. When traffic is directed to a label's URL, the traffic is routed to one specific revision.
+
+A label name must:
+
+- consist of lower case alphanumeric characters or dashes ('-')
+- start with an alphabetic character
+- end with an alphanumeric character
+- not have two consecutive dashes (--)
+- not be more than 64 characters
+
+You can manage labels from your container app's **Revision management** page in the Azure portal.
++
+You can find the label URL in the revision details pane.
+ ## Activation state
-New revisions remain active until you deactivate them, or you set your container app to automatically deactivate old revisions.
+In *multiple revision mode*, revisions remain active until you deactivate them. You can activate and deactivate revisions from your container app's **Revision management** page in the Azure portal or from the Azure CLI.
-- Inactive revisions remain as a snapshot record of your container app in a certain state.-- You are not charged for inactive revisions.-- Up to 100 revisions remain available before being purged.
+You aren't charged for the inactive revisions. You can have a maximum of 100 revisions, after which the oldest revision is purged.
## Next steps > [!div class="nextstepaction"] > [Application lifecycle management](application-lifecycle-management.md)+
defender-for-cloud Defender For Cloud Introduction https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/defender-for-cloud/defender-for-cloud-introduction.md
Title: Microsoft Defender for Cloud - an introduction
+ Title: What is Microsoft Defender for Cloud?
description: Use Microsoft Defender for Cloud to protect your Azure, hybrid, and multi-cloud resources and workloads. --++ Previously updated : 03/31/2022 Last updated : 05/11/2022 # What is Microsoft Defender for Cloud?
-Defender for Cloud is a tool for security posture management and threat protection. It strengthens the security posture of your cloud resources, and with its integrated Microsoft Defender plans, Defender for Cloud protects workloads running in Azure, hybrid, and other cloud platforms.
+Microsoft Defender for Cloud is a Cloud Workload Protection Platform (CWPP) that also delivers Cloud Security Posture Management (CSPM) for all of your Azure, on-premises, and multi-cloud (Amazon AWS and Google GCP) resources.
-Defender for Cloud provides the tools needed to harden your resources, track your security posture, protect against cyber attacks, and streamline security management. Because it's natively integrated, deployment of Defender for Cloud is easy, providing you with simple auto provisioning to secure your resources by default.
+- [**Defender for Cloud recommendations**](security-policy-concept.md) identify cloud workloads that require security actions and provide you with steps to protect your workloads from security risks.
+- [**Defender for Cloud secure score**](secure-score-security-controls.md) gives you a clear view of your security posture based on the implementation of the security recommendations so you can track new security opportunities and precisely report on the progress of your security efforts.
+- [**Defender for Cloud alerts**](alerts-overview.md) warn you about security events in your workloads in real-time, including the indicators that led to the event.
Defender for Cloud fills three vital needs as you manage the security of your resources and workloads in the cloud and on-premises:
defender-for-cloud Defender For Containers Introduction https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/defender-for-cloud/defender-for-containers-introduction.md
Title: Container security with Microsoft Defender for Cloud description: Learn about Microsoft Defender for Containers-- Previously updated : 05/08/2022 Last updated : 05/15/2022 # Overview of Microsoft Defender for Containers
The architecture of the various elements involved in the full range of protectio
Defender for Containers protects your clusters whether they're running in: -- **Azure Kubernetes Service (AKS)** - Microsoft's managed service for developing, deploying, and managing containerized applications.
+- **Azure Kubernetes Service (AKS) (Preview)** - Microsoft's managed service for developing, deploying, and managing containerized applications.
-- **Amazon Elastic Kubernetes Service (EKS) in a connected Amazon Web Services (AWS) account** - Amazon's managed service for running Kubernetes on AWS without needing to install, operate, and maintain your own Kubernetes control plane or nodes.
+- **Amazon Elastic Kubernetes Service (EKS) in a connected Amazon Web Services (AWS) account (Preview)** - Amazon's managed service for running Kubernetes on AWS without needing to install, operate, and maintain your own Kubernetes control plane or nodes.
-- **Google Kubernetes Engine (GKE) in a connected Google Cloud Platform (GCP) project** - GoogleΓÇÖs managed environment for deploying, managing, and scaling applications using GCP infrastructure.
+- **Google Kubernetes Engine (GKE) in a connected Google Cloud Platform (GCP) project (Preview)** - GoogleΓÇÖs managed environment for deploying, managing, and scaling applications using GCP infrastructure.
- **An unmanaged Kubernetes distribution** (using Azure Arc-enabled Kubernetes) - Cloud Native Computing Foundation (CNCF) certified Kubernetes clusters hosted on-premises or on IaaS.
-> [!NOTE]
-> Defender for Containers' support for Arc-enabled Kubernetes clusters (AWS EKS and GCP GKE clusters) is a preview feature.
- For high-level diagrams of each scenario, see the relevant tabs below. In the diagrams you'll see that the items received and analyzed by Defender for Cloud include:
defender-for-iot How To Install Software https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/defender-for-iot/organizations/how-to-install-software.md
This procedure describes how to install OT sensor software on a physical or virt
:::image type="content" source="media/tutorial-install-components/language-select.png" alt-text="Screenshot of the sensor's language select screen.":::
-1. Select the sensor's architecture.
+1. Select the sensor's architecture. For example:
:::image type="content" source="media/tutorial-install-components/sensor-architecture.png" alt-text="Screenshot of the sensor's architecture select screen.":::
defender-for-iot Ot Pre Configured Appliances https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/defender-for-iot/organizations/ot-pre-configured-appliances.md
Title: Preconfigured appliances for OT network monitoring - Microsoft Defender for IoT
+ Title: Preconfigured appliances for OT network monitoring
description: Learn about the appliances available for use with Microsoft Defender for IoT OT sensors and on-premises management consoles. Last updated 04/07/2022
healthcare-apis Release Notes https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/healthcare-apis/azure-api-for-fhir/release-notes.md
Previously updated : 04/14/2022 Last updated : 05/13/2022
Azure API for FHIR provides a fully managed deployment of the Microsoft FHIR Server for Azure. The server is an implementation of the [FHIR](https://hl7.org/fhir) standard. This document provides details about the features and enhancements made to Azure API for FHIR.
+## April 2022
+
+### **Enhancements**
+
+|Enhancements &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |Related information |
+| :-- | : |
+|FHIRPath Patch |FHIRPath Patch was added as a feature to both the Azure API for FHIR. This implements FHIRPath Patch as defined on the [HL7](http://hl7.org/fhir/fhirpatch.html) website. |
+|Move Bundle notification to Core |With the introduction of the Resource.Bundle namespace to Core, the Resource references to the string resources file had to be made more explicit. For more information, see [PR #2478](https://github.com/microsoft/fhir-server/pull/2478). |
+|Handles invalid header on versioned update |When the versioning policy is set to "versioned-update", we required that the most recent version of the resource is provided in the request's if-match header on an update. The specified version must be in ETag format. Previously, a 500 would be returned if the version was invalid or in an incorrect format. This update now returns a 400 Bad Request. For more information, see [PR #2467](https://github.com/microsoft/fhir-server/pull/2467). |
+
+### **Bug fixes**
+
+|Bug fixes |Related information |
+| :-- | : |
+|Adds core to resource path |Part of the path to a string resource was accidentally removed in the versioning policy. This fix adds it back in. For more information, see [PR #2470](https://github.com/microsoft/fhir-server/pull/2470). |
+|SQL timeout is returning a 500 error |Fixed a bug when a SQL request hits a timeout and the request returns a 500. In the logs, this is a timeout from SQL compared to getting a 429 error from front end. For more information, see [PR #2497](https://github.com/microsoft/fhir-server/pull/2497). |
+ ## March 2022 ### **Features**
Azure API for FHIR provides a fully managed deployment of the Microsoft FHIR Ser
|Enhancements &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |Related information | | :-- | : |
-|Added 429 retry and logging in BundleHandler |We sometimes encounter 429 errors when processing a bundle. If the FHIR service receives a 429 at the BundleHandler layer, we abort processing of the bundle and skip the remaining resources. We've added an additional retry (in addition to the retry present in the data store layer) that will execute one time per resource that encounters a 429. For more about this feature enhancement, see [PR #2400](https://github.com/microsoft/fhir-server/pull/2400).|
-|Billing for $convert-data and $de-id |Azure API for FHIR's data conversion and de-identified export features are now Generally Available. Billing for $convert-data and $de-id operations in Azure API for FHIR has been enabled. Billing meters were turned on March 1, 2022. |
+|Added 429 retry and logging in BundleHandler |We sometimes encounter 429 errors when processing a bundle. If the FHIR service receives a 429 at the BundleHandler layer, we abort processing of the bundle and skip the remaining resources. We've added another retry (in addition to the retry present in the data store layer) that will execute one time per resource that encounters a 429. For more about this feature enhancement, see [PR #2400](https://github.com/microsoft/fhir-server/pull/2400).|
+|Billing for `$convert-data` and `$de-id` |Azure API for FHIR's data conversion and de-identified export features are now Generally Available. Billing for `$convert-data` and `$de-id` operations in Azure API for FHIR has been enabled. Billing meters were turned on March 1, 2022. |
### **Bug fixes**
healthcare-apis Known Issues https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/healthcare-apis/known-issues.md
+
+ Title: Azure Health Data Services known issues
+description: This article provides details about the known issues of Azure Health Data Services.
+++++ Last updated : 05/13/2022+++
+# Known issues: Azure Health Data Services
+
+This article describes the currently known issues with Azure Health Data Services and its different service types (FHIR service, DICOM service, and MedTech service) that seamlessly work with one another.
+
+Refer to the table below to find details about resolution dates or possible workarounds. For more information about the different feature enhancements and bug fixes in Azure Health Data Services, see [Release notes: Azure Health Data Services](release-notes.md).
+
+## FHIR service
+
+|Issue | Date discovered | Status | Date resolved |
+| :- | : | :- | :- |
+|The SQL Provider will cause the `RawResource` column in the database to save incorrectly. This issue occurs in a few cases when a transient exception occurs that causes the provider to use its retry logic. |April 2022 |Doesn't have a workaround. |Not resolved |
++
+## Next steps
+
+In this article, you learned about the currently known issues with Azure Health Data Services. For more information about Azure Health Data Services, see
+
+>[!div class="nextstepaction"]
+>[About Azure Health Data Services](healthcare-apis-overview.md)
+
+For information about the features and bug fixes in Azure API for FHIR, see
+
+>[!div class="nextstepaction"]
+>[Release notes: Azure API for FHIR](./azure-api-for-fhir/release-notes.md)
healthcare-apis Release Notes https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/healthcare-apis/release-notes.md
Previously updated : 04/14/2022 Last updated : 05/13/2022
Azure Health Data Services is a set of managed API services based on open standards and frameworks for the healthcare industry. They enable you to build scalable and secure healthcare solutions by bringing protected health information (PHI) datasets together and connecting them end-to-end with tools for machine learning, analytics, and AI. This document provides details about the features and enhancements made to Azure Health Data Services including the different service types (FHIR service, DICOM service, and MedTech service) that seamlessly work with one another.
+## April 2022
+
+### FHIR service
+
+### **Features and enhancements**
+
+|Enhancements &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |Related information |
+| :- | : |
+|FHIRPath Patch |FHIRPath Patch was added as a feature to both the Azure API for FHIR. This implements FHIRPath Patch as defined on the [HL7](http://hl7.org/fhir/fhirpatch.html) website. |
+|Handles invalid header on versioned update |When the versioning policy is set to "versioned-update", we required that the most recent version of the resource is provided in the request's if-match header on an update. The specified version must be in ETag format. Previously, a 500 would be returned if the version was invalid or in an incorrect format. This update now returns a 400 Bad Request. For more information, see [PR #2467](https://github.com/microsoft/fhir-server/pull/2467). |
+|Bulk import in public preview |The bulk-import feature enables importing FHIR data to the FHIR server at high throughput using the $import operation. It's designed for initial data load into the FHIR server. For more information, see [Bulk-import FHIR data (Preview)](./../healthcare-apis/fhir/import-data.md). |
+
+### **Bug fixes**
+
+|Bug fixes |Related information |
+| :-- | : |
+|Adds core to resource path |Part of the path to a string resource was accidentally removed in the versioning policy. This fix adds it back in. For more information, see [PR #2470](https://github.com/microsoft/fhir-server/pull/2470). |
+
+### **Known issues**
+
+For more information about the currently known issues with the FHIR service, see [Known issues: FHIR service](known-issues.md).
+
+### DICOM service
+
+### **Bug fixes**
+
+|Bug fixes |Related information |
+| :-- | : |
+|Reduce the strictness of validation applied to incoming DICOM files |When value representation (VR) is a decimal string (DS)/ integer string (IS), `fo-dicom` serialization treats value as a number. Customer DICOM files could be old and contains invalid numbers. Our service blocks such file upload due to the serialization exception. For more information, see [PR #1450](https://github.com/microsoft/dicom-server/pull/1450). |
+|Correctly parse a range of input in the content negotiation headers |Currently, WADO with Accept: multipart/related; type=application/dicom will throw an error. It will accept Accept: multipart/related; type="application/dicom", but they should be equivalent. For more information, see [PR #1462](https://github.com/microsoft/dicom-server/pull/1462). |
+|Fixed an issue where parallel upload of images in a study could fail under certain circumstances |Handle race conditions during parallel instance inserts in the same study. For more information, see [PR #1491](https://github.com/microsoft/dicom-server/pull/1491) and [PR #1496](https://github.com/microsoft/dicom-server/pull/1496). |
+ ## March 2022 ### Azure Health Data Services
Azure Health Data Services is a set of managed API services based on open standa
|Bug fixes |Related information | | :-- | : | |Resolved 500 error when the date was passed with a time zone. |This fixes a 500 error when a date with a time zone was passed into a datetime field [#2270](https://github.com/microsoft/fhir-server/pull/2270). |
-|Resolved issue where posting a bundle with incorrect Media Type returned a 500 error. |Previously when posting a search with a key that contains certain characters, a 500 error is returned. This fixes this issue [#2264](https://github.com/microsoft/fhir-server/pull/2264), and it addresses [#2148](https://github.com/microsoft/fhir-server/issues/2148). |
+|Resolved issue when posting a bundle with incorrect Media Type returned a 500 error. |Previously when posting a search with a key that contains certain characters, a 500 error is returned. This fixes this issue [#2264](https://github.com/microsoft/fhir-server/pull/2264), and it addresses [#2148](https://github.com/microsoft/fhir-server/issues/2148). |
### DICOM service
Azure Health Data Services is a set of managed API services based on open standa
## Next steps
+In this article, you learned about the features and enhancements made to Azure Health Data Services. For more information about the known issues with Azure Health Data Services, See
+
+>[!div class="nextstepaction"]
+>[Known issues: Azure Health Data Services](known-issues.md)
+ For information about the features and bug fixes in Azure API for FHIR, see >[!div class="nextstepaction"]
iot-edge How To Provision Devices At Scale Linux Symmetric https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/iot-edge/how-to-provision-devices-at-scale-linux-symmetric.md
Title: Create and provision IoT Edge devices using symmetric keys on Linux - Azu
description: Use symmetric key attestation to test provisioning Linux devices at scale for Azure IoT Edge with device provisioning service Previously updated : 10/29/2021 Last updated : 05/12/2022
Have the following information ready:
The `provisioning:` line should have no preceding whitespace, and nested items should be indented by two spaces.
- ```yml
- # DPS TPM provisioning configuration
- provisioning:
- source: "dps"
- global_endpoint: "https://global.azure-devices-provisioning.net"
- scope_id: "PASTE_YOUR_SCOPE_ID_HERE"
- attestation:
- method: "symmetric_key"
- registration_id: "PASTE_YOUR_REGISTRATION_ID_HERE"
- symmetric_key: "PASTE_YOUR_PRIMARY_KEY_OR_DERIVED_KEY_HERE"
- # always_reprovision_on_startup: true
- # dynamic_reprovisioning: false
+ ```yml
+ # DPS TPM provisioning configuration
+ provisioning:
+ source: "dps"
+ global_endpoint: "https://global.azure-devices-provisioning.net"
+ scope_id: "PASTE_YOUR_SCOPE_ID_HERE"
+ attestation:
+ method: "symmetric_key"
+ registration_id: "PASTE_YOUR_REGISTRATION_ID_HERE"
+ symmetric_key: "PASTE_YOUR_PRIMARY_KEY_OR_DERIVED_KEY_HERE"
+
+ # always_reprovision_on_startup: true
+ # dynamic_reprovisioning: true
``` 1. Update the values of `scope_id`, `registration_id`, and `symmetric_key` with your DPS and device information.
Have the following information ready:
1. Find the **Provisioning** section of the file. Uncomment the lines for DPS provisioning with symmetric key, and make sure any other provisioning lines are commented out.
- ```toml
- # DPS provisioning with symmetric key
- [provisioning]
- source = "dps"
- global_endpoint = "https://global.azure-devices-provisioning.net"
- id_scope = "PASTE_YOUR_SCOPE_ID_HERE"
-
- [provisioning.attestation]
- method = "symmetric_key"
- registration_id = "PASTE_YOUR_REGISTRATION_ID_HERE"
-
- symmetric_key = { value = "PASTE_YOUR_PRIMARY_KEY_OR_DERIVED_KEY_HERE" }
- ```
+ ```toml
+ # DPS provisioning with symmetric key
+ [provisioning]
+ source = "dps"
+ global_endpoint = "https://global.azure-devices-provisioning.net"
+ id_scope = "PASTE_YOUR_SCOPE_ID_HERE"
+
+ [provisioning.attestation]
+ method = "symmetric_key"
+ registration_id = "PASTE_YOUR_REGISTRATION_ID_HERE"
+
+ symmetric_key = { value = "PASTE_YOUR_PRIMARY_KEY_OR_DERIVED_KEY_HERE" }
+
+ # auto_reprovisioning_mode = Dynamic
+ ```
1. Update the values of `id_scope`, `registration_id`, and `symmetric_key` with your DPS and device information.
Have the following information ready:
If you use any PKCS#11 URIs, find the **PKCS#11** section in the config file and provide information about your PKCS#11 configuration.
+1. Optionally, find the auto reprovisioning mode section of the file. Use the `auto_reprovisioning_mode` parameter to configure your device's reprovisioning behavior. **Dynamic** - Reprovision when the device detects that it may have been moved from one IoT Hub to another. This is the default. **AlwaysOnStartup** - Reprovision when the device is rebooted or a crash causes the daemon(s) to restart. **OnErrorOnly** - Never trigger device reprovisioning automatically. Each mode has an implicit device reprovisioning fallback if the device is unable to connect to IoT Hub during identity provisioning due to connectivity errors. For more information, see [IoT Hub device reprovisioning concepts](../iot-dps/concepts-device-reprovision.md).
+ 1. Save and close the config.toml file. 1. Apply the configuration changes that you made to IoT Edge.
iot-edge How To Provision Devices At Scale Linux Tpm https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/iot-edge/how-to-provision-devices-at-scale-linux-tpm.md
description: Use a simulated TPM on a Linux device to test the Azure IoT Hub dev
Previously updated : 10/28/2021 Last updated : 05/13/2022
After the runtime is installed on your device, configure the device with the inf
attestation: method: "tpm" registration_id: "REGISTRATION_ID_HERE"+ # always_reprovision_on_startup: true # dynamic_reprovisioning: false ```
After the runtime is installed on your device, configure the device with the inf
[provisioning.attestation] method = "tpm" registration_id = "REGISTRATION_ID_HERE"+
+ # auto_reprovisioning_mode = Dynamic
``` 1. Update the values of `id_scope` and `registration_id` with your device provisioning service and device information. The `scope_id` value is the **ID Scope** from your device provisioning service instance's overview page.
-1. Optionally, find the auto reprovisioning mode section of the file. Use the `auto_reprovisioning_mode` parameter to configure your device's reprovisioning behavior to either `Dynamic`, `AlwaysOnStartup`, or `OnErrorOnly`. For more information, see [IoT Hub device reprovisioning concepts](../iot-dps/concepts-device-reprovision.md).
+1. Optionally, find the auto reprovisioning mode section of the file. Use the `auto_reprovisioning_mode` parameter to configure your device's reprovisioning behavior. **Dynamic** - Reprovision when the device detects that it may have been moved from one IoT Hub to another. This is the default. **AlwaysOnStartup** - Reprovision when the device is rebooted or a crash causes the daemon(s) to restart. **OnErrorOnly** - Never trigger device reprovisioning automatically. Each mode has an implicit device reprovisioning fallback if the device is unable to connect to IoT Hub during identity provisioning due to connectivity errors. For more information, see [IoT Hub device reprovisioning concepts](../iot-dps/concepts-device-reprovision.md).
1. Save and close the file.
iot-edge How To Provision Devices At Scale Linux X509 https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/iot-edge/how-to-provision-devices-at-scale-linux-x509.md
Title: Create and provision IoT Edge devices at scale using X.509 certificates o
description: Use X.509 certificates to test provisioning devices at scale for Azure IoT Edge with device provisioning service Previously updated : 02/28/2022 Last updated : 05/13/2022
Have the following information ready:
# registration_id: "OPTIONAL_REGISTRATION_ID_LEAVE_COMMENTED_OUT_TO_REGISTER_WITH_CN_OF_IDENTITY_CERT" identity_cert: "REQUIRED_URI_TO_DEVICE_IDENTITY_CERTIFICATE_HERE" identity_pk: "REQUIRED_URI_TO_DEVICE_IDENTITY_PRIVATE_KEY_HERE"
- # always_reprovision_on_startup: true
- # dynamic_reprovisioning: false
+
+ # always_reprovision_on_startup: true
+ # dynamic_reprovisioning: false
``` 1. Update the values of `scope_id`, `identity_cert`, and `identity_pk` with your DPS and device information.
Have the following information ready:
identity_cert = "DEVICE_IDENTITY_CERTIFICATE_HERE" identity_pk = "DEVICE_IDENTITY_PRIVATE_KEY_HERE"+
+ # auto_reprovisioning_mode = Dynamic
``` 1. Update the value of `id_scope` with the scope ID you copied from your instance of DPS.
Have the following information ready:
If you use any PKCS#11 URIs, find the **PKCS#11** section in the config file and provide information about your PKCS#11 configuration.
+1. Optionally, find the auto reprovisioning mode section of the file. Use the `auto_reprovisioning_mode` parameter to configure your device's reprovisioning behavior. **Dynamic** - Reprovision when the device detects that it may have been moved from one IoT Hub to another. This is the default. **AlwaysOnStartup** - Reprovision when the device is rebooted or a crash causes the daemon(s) to restart. **OnErrorOnly** - Never trigger device reprovisioning automatically. Each mode has an implicit device reprovisioning fallback if the device is unable to connect to IoT Hub during identity provisioning due to connectivity errors. For more information, see [IoT Hub device reprovisioning concepts](../iot-dps/concepts-device-reprovision.md).
+ 1. Save and close the file. 1. Apply the configuration changes that you made to IoT Edge.
iot-edge Troubleshoot Common Errors https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/iot-edge/troubleshoot-common-errors.md
Or
```output info: edgelet_docker::runtime -- Starting module edgeHub... warn: edgelet_utils::logging -- Could not start module edgeHub
-warn: edgelet_utils::logging -- caused by: failed to create endpoint edgeHub on network nat: hnsCall failed in Win32:
+warn: edgelet_utils::logging -- caused by: failed to create endpoint edgeHub on network nat: hnsCall failed in Win32:
The process cannot access the file because it is being used by another process. (0x20) ```
Windows Registry Editor Version 5.00
"TypesSupported"=dword:00000007 ```
+## DPS client error
+
+**Observed behavior:**
+
+IoT Edge fails to start with error message `failed to provision with IoT Hub, and no valid device backup was found dps client error.`
+
+**Root cause:**
+
+A group enrollment is used to provision an IoT Edge device to an IoT Hub. The IoT Edge device is moved to a different hub. The registration is deleted in DPS. A new registration is created in DPS for the new hub. The device is not reprovisioned.
+
+**Resolution:**
+
+1. Verify your DPS credentials are correct.
+1. Apply your configuration using `sudo iotedge apply config`.
+1. If the device isn't reprovisioned, restart the device using `sudo iotedge system restart`.
+1. If the device isn't reprovisioned, force reprovisioning using `sudo iotedge system reprovision`.
+
+To automatically reprovision, set `dynamic_reprovisioning: true` in the device configuration file. Setting this flag to true opts in to the dynamic re-provisioning feature. IoT Edge detects situations where the device appears to have been reprovisioned in the cloud by monitoring its own IoT Hub connection for certain errors. IoT Edge responds by shutting itself and all Edge modules down. The next time the daemon starts up, it will attempt to reprovision this device with Azure to receive the new IoT Hub provisioning information.
+
+When using external provisioning, the daemon will also notify the external provisioning endpoint about the re-provisioning event before shutting down. For more information, see [IoT Hub device reprovisioning concepts](../iot-dps/concepts-device-reprovision.md).
+ :::moniker-end <!-- end 1.1 -->
On Windows:
1. If the parameter exists, set the value of the parameter to **1**.
- 1. If the paramter doesn't exist, add it as a new parameter with the following settings:
+ 1. If the parameter doesn't exist, add it as a new parameter with the following settings:
| Setting | Value | | - | -- |
iot-hub-device-update Device Update Error Codes https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/iot-hub-device-update/device-update-error-codes.md
# Device Update for IoT Hub Error Codes
-This document provides a table of error codes for various Device Update components. It is meant to be used as a reference for users who want to parse their own error codes to diagnose and troubleshoot issues.
+This document provides a table of error codes for various Device Update components. It's meant to be used as a reference for users who want to parse their own error codes to diagnose and troubleshoot issues.
There are two primary client-side components that may throw error codes: the Device Update agent, and the Delivery Optimization agent. Error codes also come from the Device Update content service.
The Device Update for IoT Hub Core PnP interface reports `ResultCode` and `Exten
`ResultCode` is a general status code and `ExtendedResultCode` is an integer with encoded error information.
-You will most likely see the `ExtendedResultCode` as a signed integer in the PnP interface. To decode the `ExtendedResultCode`, convert the signed integer to
+You'll most likely see the `ExtendedResultCode` as a signed integer in the PnP interface. To decode the `ExtendedResultCode`, convert the signed integer to
unsigned hex. Only the first 4 bytes of the `ExtendedResultCode` are used and are of the form `F` `FFFFFFF` where the first nibble is the **Facility Code** and the rest of the bits are the **Error Code**.
the rest of the bits are the **Error Code**.
+ Facility code (4 bits) ```
-Please refer to [Device Update Agent result codes and extended result codes](https://github.com/Azure/iot-hub-device-update/tree/main/docs/agent-reference/device-update-agent-extended-result-codes.md) or [implement a custom Content Handler](https://github.com/Azure/iot-hub-device-update/tree/main/src/content_handlers) for details on parsing codes.
+Refer to [Device Update Agent result codes and extended result codes](https://github.com/Azure/iot-hub-device-update/tree/main/docs/agent-reference/device-update-agent-extended-result-codes.md) or [implement a custom Content Handler](https://github.com/Azure/iot-hub-device-update/tree/main/src/content_handlers) for details on parsing codes.
## Device Update content service
-The following table lists error codes pertaining to the content service component of the Device Update service. The content service component is responsible for handling importing of update content. Additional troubleshooting information is also available for [importing proxy updates](device-update-proxy-update-troubleshooting.md).
+The following table lists error codes pertaining to the content service component of the Device Update service. The content service component is responsible for handling importing of update content. More troubleshooting information is also available for [importing proxy updates](device-update-proxy-update-troubleshooting.md).
| Error Code | String Error | Next steps | |-|-||
-| "UpdateAlreadyExists" | Update with the same identity already exists. | Make sure you are importing an update that hasnΓÇÖt already been imported into this instance of Device Update for IoT Hub. |
+| "UpdateAlreadyExists" | Update with the same identity already exists. | Make sure you're importing an update that hasnΓÇÖt already been imported into this instance of Device Update for IoT Hub. |
| "DuplicateContentImport" | Identical content imported simultaneously multiple times. | Same as for UpdateAlreadyExists. | | "CannotProcessImportManifest" | Error processing import manifest. | Refer to [import concepts](./import-concepts.md) and [import update](./create-update.md) documentation for proper import manifest formatting. | | "CannotDownload" | Cannot download import manifest. | Check to make sure the URL for the import manifest file is still valid. | | "CannotParse" | Cannot parse import manifest. | Check your import manifest for accuracy against the schema defined in the [import update](./create-update.md) documentation. | | "UnsupportedVersion" | Import manifest schema version is not supported. | Make sure your import manifest is using the latest schema defined in the [import update](./create-update.md) documentation. |
-| "UpdateLimitExceeded" | Error importing update due to exceeded limit. | You have reached a [limit](device-update-limits.md) on the number of different Providers, Names or Versions allowed in your instance of Device Update for IoT Hub. Delete some updates from your instance and try again. |
-| "UpdateProvider" | Cannot import a new update provider. | You have reached a [limit](device-update-limits.md) on the number of different __Providers__ allowed in your instance of Device Update for IoT Hub. Delete some updates from your instance and try again. |
-| "UpdateName" | Cannot import a new update name for the specified provider. | You have reached a [limit](device-update-limits.md) on the number of different __Names__ allowed under one Provider in your instance of Device Update for IoT Hub. Delete some updates from your instance and try again. |
-| "UpdateVersion" | Cannot import a new update version for the specified provider and name. | You have reached a [limit](device-update-limits.md) on the number of different __Versions__ allowed under one Provider and Name in your instance of Device Update for IoT Hub. Delete some updates with that Name from your instance and try again. |
-| "UpdateProviderCompatibility" | Cannot import additional update provider with the specified compatibility. | When defining device manufacturer and device model compatibility properties in an import manifest, keep in mind that Device Update for IoT Hub supports a single Provider and Name combination for a given manufacturer/model. This means if you try to use the same manufacturer/model compatibility properties with more than one Provider/Name combination, you will see these errors. To resolve this, make sure that all updates for a given device (as defined by manufacturer/model) use the same Provider and Name. While not required, you may want to consider making the Provider the same as the manufacturer and the Name the same as the model, just for simplicity. |
-| "UpdateNameCompatibility" | Cannot import additional update name with the specified compatibility. | When defining device manufacturer and device model compatibility properties in an import manifest, keep in mind that Device Update for IoT Hub supports a single Provider and Name combination for a given manufacturer/model. This means if you try to use the same manufacturer/model compatibility properties with more than one Provider/Name combination, you will see these errors. To resolve this, make sure that all updates for a given device (as defined by manufacturer/model) use the same Provider and Name. While not required, you may want to consider making the Provider the same as the manufacturer and the Name the same as the model, just for simplicity. |
-| "UpdateVersionCompatibility" | Cannot import additional update version with the specified compatibility. | When defining device manufacturer and device model compatibility properties in an import manifest, keep in mind that Device Update for IoT Hub supports a single Provider and Name combination for a given manufacturer/model. This means if you try to use the same manufacturer/model compatibility properties with more than one Provider/Name combination, you will see these errors. To resolve this, make sure that all updates for a given device (as defined by manufacturer/model) use the same Provider and Name. While not required, you may want to consider making the Provider the same as the manufacturer and the Name the same as the model, just for simplicity. |
+| Error importing update due to exceeded limit. | Cannot import additional update provider. | You've reached a [limit](device-update-limits.md) on the number of different __Providers__ allowed in your instance of Device Update for IoT Hub. Delete some updates from your instance and try again. |
+| Error importing update due to exceeded limit. | Cannot import additional update name for the specified provider. | You've reached a [limit](device-update-limits.md) on the number of different __Names__ allowed under one Provider in your instance of Device Update for IoT Hub. Delete some updates from your instance and try again. |
+| Error importing update due to exceeded limit. | Cannot import additional update version for the specified provider and name. | You've reached a [limit](device-update-limits.md) on the number of different __Versions__ allowed under one Provider and Name in your instance of Device Update for IoT Hub. Delete some updates with that Name from your instance and try again. |
+| Error importing update due to exceeded limit. | Cannot import additional update provider with the specified compatibility. | When defining [compatibility properties](import-schema.md#compabilityinfo-object) in an import manifest, keep in mind that Device Update for IoT Hub supports a single Provider and Name combination for a given set of compatibility properties. If you try to use the same compatibility properties with more than one Provider/Name combination, you'll see these errors. To resolve this issue, make sure that all updates for a given device (as defined by compatibility properties) use the same Provider and Name. |
+| Error importing update due to exceeded limit. | Cannot import additional update name with the specified compatibility. | When defining device [compatibility properties](import-schema.md#compabilityinfo-object) in an import manifest, keep in mind that Device Update for IoT Hub supports a single Provider and Name combination for a given set of compatibility properties. If you try to use the same compatibility properties with more than one Provider/Name combination, you'll see these errors. To resolve this issue, make sure that all updates for a given device (as defined by compatibility properties) use the same Provider and Name. |
+| Error importing update due to exceeded limit. | Cannot import additional update version with the specified compatibility. | When defining device [compatibility properties](import-schema.md#compabilityinfo-object) in an import manifest, keep in mind that Device Update for IoT Hub supports a single Provider and Name combination for a given set of compatibility properties. If you try to use the same compatibility properties with more than one Provider/Name combination, you'll see these errors. To resolve this issue, make sure that all updates for a given device (as defined by compatibility properties) use the same Provider and Name. |
| "CannotProcessUpdateFile" | Error processing source file. | | | "ContentFileCannotDownload" | Cannot download source file. | Check to make sure the URL for the update file(s) is still valid. | | "SourceFileMalwareDetected" | A known malware signature was detected in a file being imported. | Content imported into Device Update for IoT Hub is scanned for malware by several different mechanisms. If a known malware signature is identified, the import will fail and a unique error message will be returned. The error message contains the description of the malware signature, and a file hash for each file where the signature was detected. You can use the file hash to find the exact file being flagged, and use the description of the malware signature to check that file for malware. <br><br>Once you have removed the malware from any files being imported, you can start the import process again. |
-| "SourceFilePendingMalwareAnalysis" | A signature was detected in a file being imported that may indicate malware is present. | Content imported into Device Update for IoT Hub is scanned for malware by several different mechanisms. If a signature is identified that is not an exact match for known malware, but has characteristics of malware, the import will fail and a unique error message will be returned. The error message contains the description of the suspected malware signature, and a file hash for each file where the signature was detected. You can use the file hash to find the exact file being flagged, and use the description of the malware signature to check that file for malware. <br><br>Once you have removed the malware from any files being imported, you can start the import process again. If you are certain your files are free of malware and continue to see this error, use the [Contact Microsoft Support](troubleshoot-device-update.md#contact) process. |
+| "SourceFilePendingMalwareAnalysis" | A signature was detected in a file being imported that may indicate malware is present. | Content imported into Device Update for IoT Hub is scanned for malware by several different mechanisms. The import will fail if a scan signature has _characteristics_ of malware, even if there is not an exact match to known malware. When this occurs, a unique error message will be returned. The error message contains the description of the suspected malware signature, and a file hash for each file where the signature was detected. You can use the file hash to find the exact file being flagged, and use the description of the malware signature to check that file for malware. <br><br>Once you've removed the malware from any files being imported, you can start the import process again. If you're certain your files are free of malware and continue to see this error, use the [Contact Microsoft Support](troubleshoot-device-update.md#contact) process. |
**[Next Step: Troubleshoot issues with Device Update](.\troubleshoot-device-update.md)**
sentinel Normalization Parsers List https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/sentinel/normalization-parsers-list.md
Title: List of Microsoft Sentinel Advanced Security Information Model (ASIM) parsers | Microsoft Docs
-description: This article list Advanced Security Information Model (ASIM) parsers .
+description: This article lists Advanced Security Information Model (ASIM) parsers.
Last updated 05/02/2022
Microsoft Sentinel provides the following out-of-the-box, product-specific Netwo
| **Microsoft Defender for IoT - Endpoint** |`_ASim_NetworkSession_MD4IoT` (regular)<br><br>`_Im_NetworkSession_MD4IoT` (filtering) | `ASimNetworkSessionMD4IoT` (regular)<br><br> `vimNetworkSessionMD4IoT` (filtering) | | **Palo Alto PanOS traffic logs** collected using CEF |`_ASim_NetworkSession_PaloAltoCEF` (regular)<br> `_Im_NetworkSession_PaloAltoCEF` (filtering) | `ASimNetworkSessionPaloAltoCEF` (regular)<br> `vimNetworkSessionPaloAltoCEF` (filtering) | | **Sysmon for Linux** (event 3)<br> Collected using the Log Analytics Agent<br> or the Azure Monitor Agent |`_ASim_NetworkSession_LinuxSysmon` (regular)<br><br>`_Im_NetworkSession_LinuxSysmon` (filtering) | `ASimNetworkSessionLinuxSysmon` (regular)<br><br> `vimNetworkSessionLinuxSysmon` (filtering) |
+| **Vectra AI** |`_ASim_NetworkSession_VectraIA` (regular)<br> `_Im_NetworkSession_VectraIA` (filtering) | `AsimNetworkSessionVectraAI` (regular)<br> `vimNetworkSessionVectraAI` (filtering) |
| **Windows Firewall logs**<br>Collected as Windows events using the Log Analytics Agent (Event table) or Azure Monitor Agent (WindowsEvent table). Supports Windows events 5150 to 5159. |`_ASim_NetworkSession_`<br>`MicrosoftWindowsEventFirewall` (regular)<br><br>`_Im_NetworkSession_`<br>`MicrosoftWindowsEventFirewall` (filtering) | `ASimNetworkSession`<br>`MicrosoftWindowsEventFirewall` (regular)<br><br> `vimNetworkSession`<br>`MicrosoftWindowsEventFirewall` (filtering) | | **Zscaler ZIA firewall logs** |`_ASim_NetworkSessionZscalerZIA` (regular)<br> `_Im_NetworkSessionZscalerZIA` (filtering) | `AsimNetworkSessionZscalerZIA` (regular)<br> `vimNetowrkSessionSzcalerZIA` (filtering) |
Learn more about ASIM parsers:
- [Develop custom ASIM parsers](normalization-develop-parsers.md) - [Manage ASIM parsers](normalization-manage-parsers.md)
-For more about ASIM, in general, see:
+Learn more about ASIM:
- Watch the [Deep Dive Webinar on Microsoft Sentinel Normalizing Parsers and Normalized Content](https://www.youtube.com/watch?v=zaqblyjQW6k) or review the [slides](https://1drv.ms/b/s!AnEPjr8tHcNmjGtoRPQ2XYe3wQDz?e=R3dWeM) - [Advanced Security Information Model (ASIM) overview](normalization.md)
storage Understanding Billing https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/storage/files/understanding-billing.md
Azure Files provides two distinct billing models: provisioned and pay-as-you-go.
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/m5_-GsKv4-o" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> :::column-end::: :::column:::
- This video is an interview discussing covering the basics of the Azure Files billing model, including how to optimize Azure file shares to achieve the lowest costs possible and how to compare Azure Files to other file storage offerings on-premises and in the cloud.
+ This video is an interview that discusses the basics of the Azure Files billing model, including how to optimize Azure file shares to achieve the lowest costs possible and how to compare Azure Files to other file storage offerings on-premises and in the cloud.
:::column-end::: :::row-end:::
Azure Files uses the base-2 units of measurement to represent storage capacity:
| GiB | 1024 MiB (1,073,741,824 bytes) | gibibyte | | TiB | 1024 GiB (1,099,511,627,776 bytes) | tebibyte |
-Although these are the units commonly used by most operating systems and tools, they are frequently mislabeled as the base-10 units, which you may be more familiar with: KB, MB, GB, and TB. Although the rationale may vary, the common reason why operating systems like Windows mislabel the storage units is because many operating systems began using these acronyms before they were standardized by the IEC, BIPM, and NIST.
+Although the base-2 units of measure are commonly used by most operating systems and tools to measure storage quantities, they are frequently mislabeled as the base-10 units, which you may be more familiar with: KB, MB, GB, and TB. Although the reasons for the mislabeling may vary, the common reason why operating systems like Windows mislabel the storage units is because many operating systems began using these acronyms before they were standardized by the IEC, BIPM, and NIST.
The following table shows how common operating systems measure and label storage:
Check with your operating system vendor if your operating system is not listed.
## File share total cost of ownership checklist If you are migrating to Azure Files from on-premises or comparing Azure Files to other cloud storage solutions, you should consider the following factors to ensure a fair, apples-to-apples comparison: -- **How do you pay for storage, IOPS, and bandwidth?** With Azure Files, the billing model you use depends on whether you are deploying [premium](#provisioned-model) or [standard](#pay-as-you-go-model) file shares. Most cloud solutions have models that align with the principles of either provisioned storage (price determinism, simplicity) or pay-as-you-go storage (pay only for what you actually use). Of particular interest for provisioned models are minimum provisioned share size, the provisioning unit, and the ability to increase and decrease provisioning.
+- **How do you pay for storage, IOPS, and bandwidth?** With Azure Files, the billing model you use depends on whether you are deploying [premium](#provisioned-model) or [standard](#pay-as-you-go-model) file shares. Most cloud solutions have models that align with the principles of either provisioned storage, such as price determinism and simplicity, or pay-as-you-go storage, which can optimize costs by only charging you for what you actually use. Of particular interest for provisioned models are minimum provisioned share size, the provisioning unit, and the ability to increase and decrease provisioning.
- **Are there any methods to optimize storage costs?** With Azure Files, you can use [capacity reservations](#reserve-capacity) to achieve an up to 36% discount on storage. Other solutions may employ storage efficiency strategies like deduplication or compression to optionally optimize storage, but remember, these storage optimization strategies often have non-monetary costs, such as reducing performance. Azure Files capacity reservations have no side effects on performance.
If you are migrating to Azure Files from on-premises or comparing Azure Files to
- **What do you need to manage?** With Azure Files, the basic unit of management is a storage account. Other solutions may require additional management, such as operating system updates or virtual resource management (VMs, disks, network IP addresses, etc.). -- **What are the costs of value-added products, like backup, security, etc.?** Azure Files supports integrations with multiple first- and third-party [value-added services](#value-added-services), such as Azure Backup, Azure File Sync, and Azure Defender, that provide backup, replication and caching, and additional security functionality for Azure Files. Value-added solutions, whether on-premises or in the cloud, will have their own licensing and product costs, and should be considered as part of the total cost of ownership for file storage.
+- **What are the costs of value-added products, like backup, security, etc.?** Azure Files supports integrations with multiple first- and third-party [value-added services](#value-added-services). Value-added services such as Azure Backup, Azure File Sync, and Azure Defender provide backup, replication and caching, and security functionality for Azure Files. Value-added solutions, whether on-premises or in the cloud, have their own licensing and product costs, but are often considered part of the total cost of ownership for file storage.
## Reserve capacity Azure Files supports storage capacity reservations, which enable you to achieve a discount on storage by pre-committing to storage utilization. You should consider purchasing reserved instances for any production workload, or dev/test workloads with consistent footprints. When you purchase reserved capacity, your reservation must specify the following dimensions:
Once you purchase a capacity reservation, it will automatically be consumed by y
For more information on how to purchase storage reservations, see [Optimize costs for Azure Files with reserved capacity](files-reserve-capacity.md). ## Provisioned model
-Azure Files uses a provisioned model for premium file shares. In a provisioned business model, you proactively specify to the Azure Files service what your storage requirements are, rather than being billed based on what you use. This is similar to buying hardware on-premises in that when you provision an Azure file share with a certain amount of storage, you pay for that storage regardless of whether you use it or not, just like you don't start paying the costs of physical media on-premises when you start to use space. Unlike purchasing physical media on-premises, provisioned file shares can be dynamically scaled up or down depending on your storage and IO performance characteristics.
+Azure Files uses a provisioned model for premium file shares. In a provisioned business model, you proactively specify to the Azure Files service what your storage requirements are, rather than being billed based on what you use. A provisioned model for storage is similar to buying an on-premises storage solution because when you provision an Azure file share with a certain amount of storage capacity, you pay for that storage capacity regardless of whether you use it or not. Unlike purchasing physical media on-premises, provisioned file shares can be dynamically scaled up or down depending on your storage and IO performance characteristics.
The provisioned size of the file share can be increased at any time but can be decreased only after 24 hours since the last increase. After waiting for 24 hours without a quota increase, you can decrease the share quota as many times as you like, until you increase it again. IOPS/throughput scale changes will be effective within a few minutes after the provisioned size change.
-It is possible to decrease the size of your provisioned share below your used GiB. If you do this, you will not lose data, but you will still be billed for the size used and receive the performance (baseline IOPS, throughput, and burst IOPS) of the provisioned share, not the size used.
+It is possible to decrease the size of your provisioned share below your used GiB. If you do this, you will not lose data, but you will still be billed for the size used and receive the performance of the provisioned share, not the size used.
### Provisioning method When you provision a premium file share, you specify how many GiBs your workload requires. Each GiB that you provision entitles you to additional IOPS and throughput on a fixed ratio. In addition to the baseline IOPS for which you are guaranteed, each premium file share supports bursting on a best effort basis. The formulas for IOPS and throughput are as follows:
When you create a standard file share, you pick between the following tiers: tra
- Hot is for active workloads that do not involve a large number of transactions, and has a slightly lower data at-rest storage price, but slightly higher transaction prices as compared to transaction optimized. Think of it as the middle ground between the transaction optimized and cool tiers. - Cool optimizes the price for workloads that do not have much activity, offering the lowest data at-rest storage price, but the highest transaction prices.
-If you put an infrequently accessed workload in the transaction optimized tier, you will pay almost nothing for the few times in a month that you make transactions against your share, but you will pay a high amount for the data storage costs. If you were to move this same share to the cool tier, you would still pay almost nothing for the transaction costs, simply because you are very infrequently making transactions for this workload, but the cool tier has a much cheaper data storage price. Selecting the appropriate tier for your use case allows you to considerably reduce your costs.
+If you put an infrequently accessed workload in the transaction optimized tier, you will pay almost nothing for the few times in a month that you make transactions against your share, but you will pay a high amount for the data storage costs. If you were to move this same share to the cool tier, you would still pay almost nothing for the transaction costs, simply because you are infrequently making transactions for this workload, but the cool tier has a much cheaper data storage price. Selecting the appropriate tier for your use case allows you to considerably reduce your costs.
Similarly, if you put a highly accessed workload in the cool tier, you will pay a lot more in transaction costs, but less for data storage costs. This can lead to a situation where the increased costs from the transaction prices increase outweigh the savings from the decreased data storage price, leading you to pay more money on cool than you would have on transaction optimized. For some usage levels, it's possible that the hot tier will be the most cost efficient, and the cool tier will be more expensive than transaction optimized.
There are five basic transaction categories: write, list, read, other, and delet
| Write transactions | <ul><li>`CreateShare`</li><li>`SetFileServiceProperties`</li><li>`SetShareMetadata`</li><li>`SetShareProperties`</li><li>`SetShareACL`</li></ul> | <ul><li>`CopyFile`</li><li>`Create`</li><li>`CreateDirectory`</li><li>`CreateFile`</li><li>`PutRange`</li><li>`PutRangeFromURL`</li><li>`SetDirectoryMetadata`</li><li>`SetFileMetadata`</li><li>`SetFileProperties`</li><li>`SetInfo`</li><li>`Write`</li><li>`PutFilePermission`</li></ul> | | List transactions | <ul><li>`ListShares`</li></ul> | <ul><li>`ListFileRanges`</li><li>`ListFiles`</li><li>`ListHandles`</li></ul> | | Read transactions | <ul><li>`GetFileServiceProperties`</li><li>`GetShareAcl`</li><li>`GetShareMetadata`</li><li>`GetShareProperties`</li><li>`GetShareStats`</li></ul> | <ul><li>`FilePreflightRequest`</li><li>`GetDirectoryMetadata`</li><li>`GetDirectoryProperties`</li><li>`GetFile`</li><li>`GetFileCopyInformation`</li><li>`GetFileMetadata`</li><li>`GetFileProperties`</li><li>`QueryDirectory`</li><li>`QueryInfo`</li><li>`Read`</li><li>`GetFilePermission`</li></ul> |
-| Other transactions | | <ul><li>`AbortCopyFile`</li><li>`Cancel`</li><li>`ChangeNotify`</li><li>`Close`</li><li>`Echo`</li><li>`Ioctl`</li><li>`Lock`</li><li>`Logoff`</li><li>`Negotiate`</li><li>`OplockBreak`</li><li>`SessionSetup`</li><li>`TreeConnect`</li><li>`TreeDisconnect`</li><li>`CloseHandles`</li><li>`AcquireFileLease`</li><li>`BreakFileLease`</li><li>`ChangeFileLease`</li><li>`ReleaseFileLease`</li></ul> |
+| Other/protocol transactions | | <ul><li>`AbortCopyFile`</li><li>`Cancel`</li><li>`ChangeNotify`</li><li>`Close`</li><li>`Echo`</li><li>`Ioctl`</li><li>`Lock`</li><li>`Logoff`</li><li>`Negotiate`</li><li>`OplockBreak`</li><li>`SessionSetup`</li><li>`TreeConnect`</li><li>`TreeDisconnect`</li><li>`CloseHandles`</li><li>`AcquireFileLease`</li><li>`BreakFileLease`</li><li>`ChangeFileLease`</li><li>`ReleaseFileLease`</li></ul> |
| Delete transactions | <ul><li>`DeleteShare`</li></ul> | <ul><li>`ClearRange`</li><li>`DeleteDirectory`</li></li>`DeleteFile`</li></ul> | > [!Note]
virtual-machines Disks Copy Incremental Snapshot Across Regions https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/virtual-machines/disks-copy-incremental-snapshot-across-regions.md
description: Learn how to copy an incremental snapshot of a managed disk to a di
Previously updated : 04/11/2022 Last updated : 05/13/2022
This article covers copying an incremental snapshot from one region to another.
# [Azure CLI](#tab/azure-cli)
-You can use the Azure CLI to copy an incremental snapshot. You will need the latest version of the Azure CLI. See the following articles to learn how to either [install](/cli/azure/install-azure-cli) or [update](/cli/azure/update-azure-cli) the Azure CLI.
+You can use the Azure CLI to copy an incremental snapshot. You need the latest version of the Azure CLI. See the following articles to learn how to either [install](/cli/azure/install-azure-cli) or [update](/cli/azure/update-azure-cli) the Azure CLI.
-The following script will copy an incremental snapshot from one region to another:
+The following script copies an incremental snapshot from one region to another:
```azurecli subscriptionId=<yourSubscriptionID> resourceGroupName=<yourResourceGroupName>
-name=<targetSnapshotName>
+targetSnapshotName=<name>
sourceSnapshotResourceId=<sourceSnapshotResourceId> targetRegion=<validRegion> sourceSnapshotId=$(az snapshot show -n $sourceSnapshotName -g $resourceGroupName --query [id] -o tsv)
-az snapshot create -g $resourceGroupName -n $targetSnapshotName --source $sourceSnapshotId --incremental --copy-start
+az snapshot create -g $resourceGroupName -n $targetSnapshotName -l $targetRegion --source $sourceSnapshotId --incremental --copy-start
az snapshot show -n $sourceSnapshotName -g $resourceGroupName --query [completionPercent] -o tsv ```
virtual-network Nat Overview https://github.com/MicrosoftDocs/azure-docs/commits/main/articles/virtual-network/nat-gateway/nat-overview.md
Virtual Network NAT is a software defined networking service. A NAT gateway won'
* Public IP prefixes
- * Custom IP prefixes (BYOIP), to learn more, see [Custom IP address prefix (BYOIP)](/azure/virtual-network/ip-services/custom-ip-address-prefix)
+ * Public IP addresses and prefixes derived from custom IP prefixes (BYOIP), to learn more, see [Custom IP address prefix (BYOIP)](/azure/virtual-network/ip-services/custom-ip-address-prefix)
* Virtual Network NAT is compatible with standard SKU public IP addresses or public IP prefix resources or a combination of both. You can use a public IP prefix directly or distribute the public IP addresses of the prefix across multiple NAT gateway resources. The NAT gateway will groom all traffic to the range of IP addresses of the prefix.