Skip to content

Commit 518291b

Browse files
committed
Merge branch 'main' of https://github.com/MicrosoftDocs/azure-docs-pr into heidist-fresh
2 parents a722f00 + 6432968 commit 518291b

27 files changed

+126
-138
lines changed

articles/active-directory/develop/tutorial-v2-javascript-spa.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ sampleApp/
159159
In the next steps you'll create a new folder for the JavaScript SPA, and set up the user interface (UI).
160160

161161
> [!TIP]
162-
> When you set up an Azure Active Directory (Azure AD) account, you create a tenant. This is a digital representation of your organization, and is primarily associated with a domain, like Microsoft.com. If you wish to learn how applications can work with multiple tenants, refer to the [application model](https://docs.microsoft.com/azure/active-directory/develop/application-model).
162+
> When you set up an Azure Active Directory (Azure AD) account, you create a tenant. This is a digital representation of your organization, and is primarily associated with a domain, like Microsoft.com. If you wish to learn how applications can work with multiple tenants, refer to the [application model](/articles/active-directory/develop/application-model.md).
163163
164164
## Create the SPA UI
165165

@@ -178,13 +178,12 @@ In the next steps you'll create a new folder for the JavaScript SPA, and set up
178178
<title>Quickstart | MSAL.JS Vanilla JavaScript SPA</title>
179179

180180
<!-- msal.js with a fallback to backup CDN -->
181-
<script type="text/javascript" src="https://alcdn.msauth.net/lib/1.2.1/js/msal.js" integrity="sha384-9TV1245fz+BaI+VvCjMYL0YDMElLBwNS84v3mY57pXNOt6xcUYch2QLImaTahcOP" crossorigin="anonymous"></script>
182-
<script type="text/javascript">
183-
if(typeof Msal === 'undefined')document.write(unescape("%3Cscript src='https://alcdn.msftauth.net/lib/1.2.1/js/msal.js' type='text/javascript' integrity='sha384-m/3NDUcz4krpIIiHgpeO0O8uxSghb+lfBTngquAo2Zuy2fEF+YgFeP08PWFo5FiJ' crossorigin='anonymous'%3E%3C/script%3E"));
184-
</script>
181+
<script src="https://alcdn.msauth.net/browser/2.30.0/js/msal-browser.js"
182+
integrity="sha384-L8LyrNcolaRZ4U+N06atid1fo+kBo8hdlduw0yx+gXuACcdZjjquuGZTA5uMmUdS"
183+
crossorigin="anonymous"></script>
185184

186185
<!-- adding Bootstrap 4 for UI components -->
187-
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
186+
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-o4ufwq3oKqc7IoCcR08YtZXmgOljhTggRwxP2CLbSqeXGtitAxwYaUln/05nJjit" crossorigin="anonymous">
188187
</head>
189188
<body>
190189
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
@@ -488,7 +487,7 @@ The `acquireTokenSilent` method handles token acquisition and renewal without an
488487
489488
## Call the Microsoft Graph API using the acquired token
490489

491-
1. In the *JavaScriptSPA* folder create a *.js* file named *graphConfig.js*, which stores the Representational State Transfer ([REST](https://docs.microsoft.com/rest/api/azure/)) endpoints. Add the following code:
490+
1. In the *JavaScriptSPA* folder create a *.js* file named *graphConfig.js*, which stores the Representational State Transfer ([REST](/rest/api/azure/)) endpoints. Add the following code:
492491

493492
```JavaScript
494493
const graphConfig = {

articles/active-directory/develop/tutorial-v2-nodejs-console.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ async function callApi(endpoint, accessToken) {
233233
console.log('request made to web API at: ' + new Date().toString());
234234

235235
try {
236-
const response = await axios.default.get(endpoint, options);
236+
const response = await axios.get(endpoint, options);
237237
return response.data;
238238
} catch (error) {
239239
console.log(error)

articles/active-directory/develop/tutorial-v2-react.md

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -133,26 +133,24 @@ In the [Redirect URI: MSAL.js 2.0 with auth code flow](scenario-spa-app-registra
133133
import { msalConfig } from "./authConfig";
134134
```
135135

136-
1. Underneath the imports in *src/index.js* create a `PublicClientApplication` instance using the configuration from step 1.
136+
2. Underneath the imports in *src/index.js* create a `PublicClientApplication` instance using the configuration from step 1.
137137

138138
```javascript
139139
const msalInstance = new PublicClientApplication(msalConfig);
140140
```
141141

142-
1. Find the `<App />` component in *src/index.js* and wrap it in the `MsalProvider` component. Your render function should look like this:
142+
3. Find the `<App />` component in *src/index.js* and wrap it in the `MsalProvider` component. Your render function should look like this:
143143

144144
```jsx
145-
ReactDOM.render(
145+
root.render(
146146
<React.StrictMode>
147147
<MsalProvider instance={msalInstance}>
148148
<App />
149149
</MsalProvider>
150-
</React.StrictMode>,
151-
document.getElementById("root")
150+
</React.StrictMode>
152151
);
153152
```
154153

155-
156154
## Sign in users
157155

158156
Create a folder in *src* called *components* and create a file inside this folder named *SignInButton.jsx*. Add the code from either of the following sections to invoke login using a pop-up window or a full-frame redirect:
@@ -167,20 +165,22 @@ import { useMsal } from "@azure/msal-react";
167165
import { loginRequest } from "../authConfig";
168166
import Button from "react-bootstrap/Button";
169167

170-
function handleLogin(instance) {
171-
instance.loginPopup(loginRequest).catch(e => {
172-
console.error(e);
173-
});
174-
}
175168

176169
/**
177170
* Renders a button which, when selected, will open a popup for login
178171
*/
179172
export const SignInButton = () => {
180173
const { instance } = useMsal();
181174

175+
const handleLogin = (loginType) => {
176+
if (loginType === "popup") {
177+
instance.loginPopup(loginRequest).catch(e => {
178+
console.log(e);
179+
});
180+
}
181+
}
182182
return (
183-
<Button variant="secondary" className="ml-auto" onClick={() => handleLogin(instance)}>Sign in using Popup</Button>
183+
<Button variant="secondary" className="ml-auto" onClick={() => handleLogin("popup")}>Sign in using Popup</Button>
184184
);
185185
}
186186
```
@@ -195,20 +195,22 @@ import { useMsal } from "@azure/msal-react";
195195
import { loginRequest } from "../authConfig";
196196
import Button from "react-bootstrap/Button";
197197

198-
function handleLogin(instance) {
199-
instance.loginRedirect(loginRequest).catch(e => {
200-
console.error(e);
201-
});
202-
}
203198

204199
/**
205200
* Renders a button which, when selected, will redirect the page to the login prompt
206201
*/
207202
export const SignInButton = () => {
208203
const { instance } = useMsal();
209204

205+
const handleLogin = (loginType) => {
206+
if (loginType === "redirect") {
207+
instance.loginRedirect(loginRequest).catch(e => {
208+
console.log(e);
209+
});
210+
}
211+
}
210212
return (
211-
<Button variant="secondary" className="ml-auto" onClick={() => handleLogin(instance)}>Sign in using Redirect</Button>
213+
<Button variant="secondary" className="ml-auto" onClick={() => handleLogin("redirect")}>Sign in using Redirect</Button>
212214
);
213215
}
214216
```
@@ -244,7 +246,7 @@ export const SignInButton = () => {
244246
};
245247
```
246248

247-
2. Now open *src/App.js* and add replace the existing content with the following code:
249+
1. Now open *src/App.js* and add replace the existing content with the following code:
248250

249251
```jsx
250252
import React from "react";
@@ -280,20 +282,23 @@ import React from "react";
280282
import { useMsal } from "@azure/msal-react";
281283
import Button from "react-bootstrap/Button";
282284
283-
function handleLogout(instance) {
284-
instance.logoutPopup().catch(e => {
285-
console.error(e);
286-
});
287-
}
288-
289285
/**
290286
* Renders a button which, when selected, will open a popup for logout
291287
*/
292288
export const SignOutButton = () => {
293289
const { instance } = useMsal();
294290
291+
const handleLogout = (logoutType) => {
292+
if (logoutType === "popup") {
293+
instance.logoutPopup({
294+
postLogoutRedirectUri: "/",
295+
mainWindowRedirectUri: "/" // redirects the top level app after logout
296+
});
297+
}
298+
}
299+
295300
return (
296-
<Button variant="secondary" className="ml-auto" onClick={() => handleLogout(instance)}>Sign out using Popup</Button>
301+
<Button variant="secondary" className="ml-auto" onClick={() => handleLogout("popup")}>Sign out using Popup</Button>
297302
);
298303
}
299304
```
@@ -307,20 +312,22 @@ import React from "react";
307312
import { useMsal } from "@azure/msal-react";
308313
import Button from "react-bootstrap/Button";
309314
310-
function handleLogout(instance) {
311-
instance.logoutRedirect().catch(e => {
312-
console.error(e);
313-
});
314-
}
315-
316315
/**
317316
* Renders a button which, when selected, will redirect the page to the logout prompt
318317
*/
319318
export const SignOutButton = () => {
320319
const { instance } = useMsal();
320+
321+
const handleLogout = (logoutType) => {
322+
if (logoutType === "redirect") {
323+
instance.logoutRedirect({
324+
postLogoutRedirectUri: "/",
325+
});
326+
}
327+
}
321328
322329
return (
323-
<Button variant="secondary" className="ml-auto" onClick={() => handleLogout(instance)}>Sign out using Redirect</Button>
330+
<Button variant="secondary" className="ml-auto" onClick={() => handleLogout("redirect")}>Sign out using Redirect</Button>
324331
);
325332
}
326333
```
@@ -406,15 +413,15 @@ In order to render certain components only for authenticated or unauthenticated
406413
function ProfileContent() {
407414
const { instance, accounts, inProgress } = useMsal();
408415
const [accessToken, setAccessToken] = useState(null);
409-
416+
410417
const name = accounts[0] && accounts[0].name;
411-
418+
412419
function RequestAccessToken() {
413420
const request = {
414421
...loginRequest,
415422
account: accounts[0]
416423
};
417-
424+
418425
// Silently acquires an access token which is then attached to a request for Microsoft Graph data
419426
instance.acquireTokenSilent(request).then((response) => {
420427
setAccessToken(response.accessToken);
@@ -424,7 +431,7 @@ In order to render certain components only for authenticated or unauthenticated
424431
});
425432
});
426433
}
427-
434+
428435
return (
429436
<>
430437
<h5 className="card-title">Welcome {name}</h5>
@@ -450,7 +457,7 @@ In order to render certain components only for authenticated or unauthenticated
450457

451458
1. Finally, add your new `ProfileContent` component as a child of the `AuthenticatedTemplate` in your `App` component in *src/App.js*. Your `App` component should look like this:
452459

453-
```javascript
460+
```jsx
454461
function App() {
455462
return (
456463
<PageLayout>
@@ -538,15 +545,15 @@ If you're using Internet Explorer, we recommend that you use the `loginRedirect`
538545
function ProfileContent() {
539546
const { instance, accounts } = useMsal();
540547
const [graphData, setGraphData] = useState(null);
541-
548+
542549
const name = accounts[0] && accounts[0].name;
543-
550+
544551
function RequestProfileData() {
545552
const request = {
546553
...loginRequest,
547554
account: accounts[0]
548555
};
549-
556+
550557
// Silently acquires an access token which is then attached to a request for Microsoft Graph data
551558
instance.acquireTokenSilent(request).then((response) => {
552559
callMsGraph(response.accessToken).then(response => setGraphData(response));
@@ -556,7 +563,7 @@ If you're using Internet Explorer, we recommend that you use the `loginRedirect`
556563
});
557564
});
558565
}
559-
566+
560567
return (
561568
<>
562569
<h5 className="card-title">Welcome {name}</h5>

articles/azure-vmware/attach-azure-netapp-files-to-azure-vmware-solution-hosts.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ There are some important best practices to follow for optimal performance of NFS
6464
- Create Azure NetApp Files volumes using **Standard** network features to enable optimized connectivity from Azure VMware Solution private cloud via ExpressRoute FastPath connectivity.
6565
- For optimized performance, choose **UltraPerformance** gateway and enable [ExpressRoute FastPath](../expressroute/expressroute-howto-linkvnet-arm.md#configure-expressroute-fastpath) from a private cloud to Azure NetApp Files volumes virtual network. View more detailed information on gateway SKUs at [About ExpressRoute virtual network gateways](../expressroute/expressroute-about-virtual-network-gateways.md).
6666
- Based on your performance requirements, select the correct service level needed for the Azure NetApp Files capacity pool. For best performance, it's recommended to use the Ultra tier.
67-
- Create multiple datastores of 4-TB size for better performance. The default limit is 8 but it can be increased up to a maximum of 256 by submitting a support ticket. To submit a support ticket, go to [Create an Azure support request](../azure-portal/supportability/how-to-create-azure-support-request.md).
67+
- Create multiple datastores of 4-TB size for better performance. The default limit is 64 but it can be increased up to a maximum of 256 by submitting a support ticket. To submit a support ticket, go to [Create an Azure support request](../azure-portal/supportability/how-to-create-azure-support-request.md).
6868
- Work with your Microsoft representative to ensure that the Azure VMware Solution private cloud and the Azure NetApp Files volumes are deployed within same [Availability Zone](../availability-zones/az-overview.md#availability-zones).
6969

7070
## Attach an Azure NetApp Files volume to your private cloud
-163 KB
Loading

articles/cost-management-billing/costs/tutorial-acm-create-budgets.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,15 @@ Budget integration with action groups works for action groups that have enabled
160160

161161
## View budgets in the Azure mobile app
162162

163-
You can view budgets for your subscriptions and resource groups from the **Cost Management** card in Azure mobile app.
163+
You can view budgets for your subscriptions and resource groups from the **Cost Management** card in the [Azure app](https://azure.microsoft.com/get-started/azure-portal/mobile-app/).
164164

165165
1. Navigate to any subscription or resource group.
166166
1. Find the **Cost Management** card and tap **More**.
167167
1. Budgets load below the **Current cost** card. They're sorted by descending order of usage.
168168

169+
> [!NOTE]
170+
> Currently, the Azure mobile app only supports the subscription and resource group scopes for budgets.
171+
169172
:::image type="content" source="./media/tutorial-acm-create-budgets/azure-app-budgets.png" alt-text="Screenshot showing budgets in the Azure app." lightbox="./media/tutorial-acm-create-budgets/azure-app-budgets.png" :::
170173

171174
## Create and edit budgets with PowerShell

articles/hdinsight/hdinsight-managed-identities.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Managed identities are used in Azure HDInsight in multiple scenarios. See the re
4040
* [Enterprise Security Package](domain-joined/apache-domain-joined-configure-using-azure-adds.md#create-and-authorize-a-managed-identity)
4141
* [Customer-managed key disk encryption](disk-encryption.md)
4242

43-
HDInsight will automatically renew the certificates for the managed identities you use for these scenarios. However, there is a limitation when multiple different managed identities are used for long running clusters, the certificate renewal may not work as expected for all of the managed identities. Due to this limitation, if you are planning to use long running clusters (e.g. more than 60 days), we recommend to use the same managed identity for all of the above scenarios.
43+
HDInsight will automatically renew the certificates for the managed identities you use for these scenarios. However, there is a limitation when multiple different managed identities are used for long running clusters, the certificate renewal may not work as expected for all of the managed identities. Due to this limitation, we recommend to use the same managed identity for all of the above scenarios.
4444

4545
If you have already created a long running cluster with multiple different managed identities and are running into one of these issues:
4646
* In ESP clusters, cluster services starts failing or scale up and other operations start failing with authentications errors.

0 commit comments

Comments
 (0)