Skip to content

Commit 4a957dd

Browse files
authored
Update Identity Components in Blazor project template (#51134)
## Description This PR addresses a large amount of feedback from #50722 which was merged before they could all be addressed to unblock Accessibility Testing effort. The primary impacts are: #### Runtime changes - Public API change to make `AddComponentRenderMode`'s `renderMode` param nullable to support disabling interactivity on a per-page basis with the help of `@rendermode="null"` (effectively). - **IMPORTANT:** This will need follow up in the Razor Compiler. See dotnet/razor#9343 - API Proposal issue: #51170 - This is a e necessary to support the changes to add global interactivity to Identity components @SteveSandersonMS made in #50920 and have now been included in this PR. - [Add antiforgery token to forms rendered interactively on the server](425bd12) - This bug fix is necessary to make the logout button work without throwing antiforgery errors when it is rendered interactively on the server. #### Template changes - Fix compilation error due to missing `using` in `Program.cs` when the individual auth option is selected with no interactivity. - Add support for global (`--all-interactive`) instead of just per-page interactivity to the new Identity components. - Fix "Apply Migrations" link on the `DatabaseErrorPage` by calling `UseMigrationsEndPoint()` when necessary. - Add support for non-root base paths to the new Identity components. - Improve folder layout by putting most of the additional auth and Identity related files in the same /Account folder. - Use the new `IEmailSender<ApplicationUser>` API instead of `IEmailSender` for easier customization of emails. - Remove usage of `IHttpContextAccessor` from the template because that is generally regarded as bad practice due to the unnecessary reliance on `AsyncLocal`. - Remove underscore (`_`) from private field names. - Reduce usage of `null!` and `default!`. - Use normal `<button>` for logout link in nav bar rather than `<a onclick="document.getElementById('logout-form').submit();">`, and remove separate `LogoutForm.razor`. ## Customer Impact This fixes several bugs in the Blazor project template when choosing the individual auth option and makes several runtime fixes that will be beneficial to any global interactive Blazor application that needs to include some components that must always be statically rendered. ## Regression? - [ ] Yes - [x] No ## Risk - [ ] High - [ ] Medium - [x] Low Obviously, we would rather not make such a large change after RC2. Particularly when it's a change that touches public API. Fortunately, the runtime changes are very small, and only to parts of the runtime that were last updated in RC2 (see #50181 and #50946). The vast majority of the changes in the PR only affect the Blazor project template when the non-default individual auth option is selected. This was merged very late in RC2 (#50722) with the expectation that we would make major changes prior to GA. ## Verification - [x] Manual (required) - [x] Automated ## Packaging changes reviewed? - [ ] Yes - [ ] No - [x] N/A
1 parent f0236a9 commit 4a957dd

File tree

91 files changed

+2274
-1920
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+2274
-1920
lines changed

src/Components/Components/src/PublicAPI.Unshipped.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Microsoft.AspNetCore.Components.NavigationManager.ToAbsoluteUri(string? relative
2828
Microsoft.AspNetCore.Components.Rendering.ComponentState.LogicalParentComponentState.get -> Microsoft.AspNetCore.Components.Rendering.ComponentState?
2929
*REMOVED*Microsoft.AspNetCore.Components.RouteData.RouteData(System.Type! pageType, System.Collections.Generic.IReadOnlyDictionary<string!, object!>! routeValues) -> void
3030
*REMOVED*Microsoft.AspNetCore.Components.RouteData.RouteValues.get -> System.Collections.Generic.IReadOnlyDictionary<string!, object!>!
31-
Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.AddComponentRenderMode(Microsoft.AspNetCore.Components.IComponentRenderMode! renderMode) -> void
31+
Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.AddComponentRenderMode(Microsoft.AspNetCore.Components.IComponentRenderMode? renderMode) -> void
3232
Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.AddNamedEvent(string! eventType, string! assignedName) -> void
3333
Microsoft.AspNetCore.Components.RenderTree.ComponentFrameFlags
3434
Microsoft.AspNetCore.Components.RenderTree.ComponentFrameFlags.HasCallerSpecifiedRenderMode = 1 -> Microsoft.AspNetCore.Components.RenderTree.ComponentFrameFlags

src/Components/Components/src/Rendering/RenderTreeBuilder.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -627,9 +627,12 @@ public void AddComponentReferenceCapture(int sequence, Action<object> componentR
627627
/// Adds a frame indicating the render mode on the enclosing component frame.
628628
/// </summary>
629629
/// <param name="renderMode">The <see cref="IComponentRenderMode"/>.</param>
630-
public void AddComponentRenderMode(IComponentRenderMode renderMode)
630+
public void AddComponentRenderMode(IComponentRenderMode? renderMode)
631631
{
632-
ArgumentNullException.ThrowIfNull(renderMode);
632+
if (renderMode is null)
633+
{
634+
return;
635+
}
633636

634637
// Note that a ComponentRenderMode frame is technically a child of the Component frame to which it applies,
635638
// hence the terminology of "adding" it rather than "setting" it. For performance reasons, the diffing system

src/Components/Components/test/Rendering/RenderTreeBuilderTest.cs

+15-7
Original file line numberDiff line numberDiff line change
@@ -2141,18 +2141,26 @@ public void CannotAddComponentRenderModeToElement()
21412141
}
21422142

21432143
[Fact]
2144-
public void CannotAddNullComponentRenderMode()
2144+
public void CanAddNullComponentRenderMode()
21452145
{
21462146
// Arrange
21472147
var builder = new RenderTreeBuilder();
2148+
2149+
// Act
21482150
builder.OpenComponent<TestComponent>(0);
2151+
builder.AddComponentParameter(1, "param", 123);
2152+
builder.AddComponentRenderMode(null);
2153+
builder.CloseComponent();
21492154

2150-
// Act/Assert
2151-
var ex = Assert.Throws<ArgumentNullException>(() =>
2152-
{
2153-
builder.AddComponentRenderMode(null);
2154-
});
2155-
Assert.Equal("renderMode", ex.ParamName);
2155+
// Assert
2156+
Assert.Collection(
2157+
builder.GetFrames().AsEnumerable(),
2158+
frame =>
2159+
{
2160+
AssertFrame.Component<TestComponent>(frame, 2, 0);
2161+
Assert.False(frame.ComponentFrameFlags.HasFlag(ComponentFrameFlags.HasCallerSpecifiedRenderMode));
2162+
},
2163+
frame => AssertFrame.Attribute(frame, "param", 123, 1));
21562164
}
21572165

21582166
[Fact]

src/Components/Endpoints/src/Forms/EndpointAntiforgeryStateProvider.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ internal void SetRequestContext(HttpContext context)
2020
{
2121
if (_context == null)
2222
{
23-
return null;
23+
// We're in an interactive context. Use the token persisted during static rendering.
24+
return base.GetAntiforgeryToken();
2425
}
2526

2627
// We already have a callback setup to generate the token when the response starts if needed.

src/Components/Shared/src/DefaultAntiforgeryStateProvider.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public DefaultAntiforgeryStateProvider(PersistentComponentState state)
2626
{
2727
state.PersistAsJson(PersistenceKey, GetAntiforgeryToken());
2828
return Task.CompletedTask;
29-
}, RenderMode.InteractiveWebAssembly);
29+
}, RenderMode.InteractiveAuto);
3030

3131
state.TryTakeFromJson(PersistenceKey, out _currentToken);
3232
}

src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs

+13
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,19 @@ public void CanUseAntiforgeryTokenInWasm()
919919
DispatchToFormCore(dispatchToForm);
920920
}
921921

922+
[Fact]
923+
public void CanUseAntiforgeryTokenWithServerInteractivity()
924+
{
925+
var dispatchToForm = new DispatchToForm(this)
926+
{
927+
Url = "forms/antiforgery-server-interactive",
928+
FormCssSelector = "form",
929+
InputFieldId = "value",
930+
SuppressEnhancedNavigation = true,
931+
};
932+
DispatchToFormCore(dispatchToForm);
933+
}
934+
922935
[Theory]
923936
[InlineData(true)]
924937
[InlineData(false)]

src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs

+11-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using Components.TestServer.RazorComponents;
99
using Components.TestServer.RazorComponents.Pages.Forms;
1010
using Components.TestServer.Services;
11-
using Microsoft.AspNetCore.Components.WebAssembly.Server;
1211
using Microsoft.AspNetCore.Mvc;
1312

1413
namespace TestServer;
@@ -155,9 +154,18 @@ private static void MapEnhancedNavigationEndpoints(IEndpointRouteBuilder endpoin
155154
await response.WriteAsync("<html><body><h1>This is a non-Blazor endpoint</h1><p>That's all</p></body></html>");
156155
});
157156

158-
endpoints.MapPost("api/antiforgery-form", ([FromForm] string value) =>
157+
endpoints.MapPost("api/antiforgery-form", (
158+
[FromForm] string value,
159+
[FromForm(Name = "__RequestVerificationToken")] string? inFormCsrfToken,
160+
[FromHeader(Name = "RequestVerificationToken")] string? inHeaderCsrfToken) =>
159161
{
160-
return Results.Ok(value);
162+
// We shouldn't get this far without a valid CSRF token, but we'll double check it's there.
163+
if (string.IsNullOrEmpty(inFormCsrfToken) && string.IsNullOrEmpty(inHeaderCsrfToken))
164+
{
165+
throw new InvalidOperationException("Invalid POST to api/antiforgery-form!");
166+
}
167+
168+
return TypedResults.Text($"<p id='pass'>Hello {value}!</p>", "text/html");
161169
});
162170

163171
endpoints.Map("/forms/endpoint-that-never-finishes-rendering", (HttpResponse response, CancellationToken token) =>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
@page "/forms/antiforgery-server-interactive"
2+
3+
@using Microsoft.AspNetCore.Components.Forms
4+
5+
@rendermode RenderMode.InteractiveServer
6+
7+
<h3>FormRenderedWithServerInteractivityCanUseAntiforgeryToken</h3>
8+
9+
<form action="api/antiforgery-form" method="post">
10+
<AntiforgeryToken />
11+
<input type="text" id="value" name="value" />
12+
@if (HttpContext is null)
13+
{
14+
<input id="send" type="submit" value="Send" />
15+
}
16+
</form>
17+
18+
@code {
19+
[CascadingParameter]
20+
HttpContext? HttpContext { get; set; }
21+
}

src/Components/test/testassets/TestContentPackage/WasmFormComponent.razor

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
{
1717
@if (_succeeded)
1818
{
19-
<p id="pass">Posting the value succeded.</p>
19+
<p id="pass">Posting the value succeeded.</p>
2020
}
2121
else
2222
{
@@ -42,7 +42,7 @@ else
4242
if (OperatingSystem.IsBrowser())
4343
{
4444
var antiforgery = AntiforgeryState.GetAntiforgeryToken();
45-
_token = antiforgery.Value;
45+
_token = antiforgery.Value;
4646
}
4747
}
4848

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generating template-baselines.json
2+
3+
For small project template changes, you may be able to edit the `template-baselines.json` file manually. This is a good way to ensure you have correct expectations about the effects of your changes.
4+
5+
For larger changes such as adding entirely new templates, it may be impractical to type out the changes to `template-baselines.json` manually. In those cases you can follow a procedure like the following.
6+
7+
1. Ensure you've configured the necessary environment variables:
8+
- `set PATH=c:\git\dotnet\aspnetcore\.dotnet\;%PATH%` (update path as needed)
9+
- `set DOTNET_ROOT=c:\git\dotnet\aspnetcore\.dotnet` (update path as needed)
10+
2. Get to a position where you can execute the modified template(s) locally, i.e.:
11+
- Use `dotnet pack ProjectTemplatesNoDeps.slnf` (possibly with `--no-restore --no-dependencies`) to regenerate `Microsoft.DotNet.Web.ProjectTemplates.*.nupkg`
12+
- Run one of the `scripts/*.ps1` scripts to install your template pack and execute your chosen template. For example, run `powershell .\scripts\Run-BlazorWeb-Locally.ps1`
13+
- Once that has run, you should see your updated template listed when you execute `dotnet new list` or `dotnet new YourTemplateName --help`. At the point you can run `dotnet new YourTemplateName -o SomePath` directly if you want. However each time you edit template sources further, you will need to run `dotnet new uninstall Microsoft.DotNet.Web.ProjectTemplates.8.0` and then go back to the start of this whole step.
14+
- Tip: the following command combines the above steps, to go directly from editing template sources to an updated local project output: `dotnet pack ProjectTemplatesNoDeps.slnf --no-restore --no-dependencies && dotnet new uninstall Microsoft.DotNet.Web.ProjectTemplates.8.0 && rm -rf scripts\MyBlazorApp && powershell .\scripts\Run-BlazorWeb-Locally.ps1`
15+
3. After generating a particular project's output, the following can be run in a Bash prompt (e.g., using WSL):
16+
- `cd src/ProjectTemplates/scripts`
17+
- `export PROJECT_NAME=MyBlazorApp` (update as necessary - note this is the name of the directly under `scripts` containing your project output)
18+
- `find $PROJECT_NAME -type f -not -path "*/obj/*" -not -path "*/bin/*" -not -path "*/.publish/*" | sed -e "s/^$PROJECT_NAME\///" | sed -e "s/$PROJECT_NAME/{ProjectName}/g" | sed 's/.*/ "&",/' | sort -f`
19+
- This will emit the JSON-formatted lines you can manually insert into the relevant place inside `template-baselines.json`

src/ProjectTemplates/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Otherwise, you'll get a test error "Certificate error: Navigation blocked".
5050

5151
Then, use one of:
5252

53-
1. Run `src\ProjectTemplates\build.cmd -test -NoRestore -NoBuild -NoBuilddeps -configuration Release` (or equivalent src\ProjectTemplates\build.sh` command) to run all template tests.
53+
1. Run `src\ProjectTemplates\build.cmd -test -NoRestore -NoBuild -NoBuildDeps -configuration Release` (or equivalent src\ProjectTemplates\build.sh` command) to run all template tests.
5454
1. To test specific templates, use the `Run-[Template]-Locally.ps1` scripts in the script folder.
5555
- These scripts do `dotnet new -i` with your packages, but also apply a series of fixes and tweaks to the created template which keep the fact that you don't have a production `Microsoft.AspNetCore.App` from interfering.
5656
1. Run templates manually with `custom-hive` and `disable-sdk-templates` to install to a custom location and turn off the built-in templates e.g.

src/ProjectTemplates/Shared/ArgConstants.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ internal static class ArgConstants
1414
public const string CalledApiScopes = "--called-api-scopes";
1515
public const string CalledApiScopesUserReadWrite = $"{CalledApiScopes} user.readwrite";
1616
public const string NoOpenApi = "--no-openapi";
17-
public const string Auth = "-au";
1817
public const string ClientId = "--client-id";
1918
public const string Domain = "--domain";
2019
public const string DefaultScope = "--default-scope";
@@ -26,5 +25,9 @@ internal static class ArgConstants
2625
public const string NoHttps = "--no-https";
2726
public const string PublishNativeAot = "--aot";
2827
public const string NoInteractivity = "--interactivity none";
28+
public const string WebAssemblyInteractivity = "--interactivity WebAssembly";
29+
public const string AutoInteractivity = "--interactivity Auto";
30+
public const string GlobalInteractivity = "--all-interactive";
2931
public const string Empty = "--empty";
32+
public const string IndividualAuth = "--auth Individual";
3033
}

src/ProjectTemplates/Shared/AspNetProcess.cs

+12-5
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ public AspNetProcess(
4343
_output = output;
4444
_httpClient = new HttpClient(new HttpClientHandler()
4545
{
46-
AllowAutoRedirect = true,
47-
UseCookies = true,
48-
CookieContainer = new CookieContainer(),
4946
ServerCertificateCustomValidationCallback = (request, certificate, chain, errors) => (certificate.Subject != "CN=localhost" && errors == SslPolicyErrors.None) || certificate?.Thumbprint == _developmentCertificate.CertificateThumbprint,
5047
})
5148
{
@@ -124,6 +121,14 @@ public async Task AssertPagesOk(IEnumerable<Page> pages)
124121
}
125122
}
126123

124+
public async Task AssertPagesNotFound(IEnumerable<string> urls)
125+
{
126+
foreach (var url in urls)
127+
{
128+
await AssertNotFound(url);
129+
}
130+
}
131+
127132
public async Task ContainsLinks(Page page)
128133
{
129134
var response = await RetryHelper.RetryRequest(async () =>
@@ -290,8 +295,10 @@ public override string ToString()
290295
}
291296
}
292297

293-
public class Page
298+
public class Page(string url)
294299
{
295-
public string Url { get; set; }
300+
public Page() : this(null) { }
301+
302+
public string Url { get; set; } = url;
296303
public IEnumerable<string> Links { get; set; }
297304
}

src/ProjectTemplates/TestInfrastructure/PrepareForTest.targets

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<ItemGroup>
77
<AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute">
88
<_Parameter1>DotNetEfFullPath</_Parameter1>
9-
<_Parameter2>$([MSBuild]::EnsureTrailingSlash('$(NuGetPackageRoot)'))dotnet-ef/$(DotnetEfVersion)/tools/net6.0/any/dotnet-ef.dll</_Parameter2>
9+
<_Parameter2>$([MSBuild]::EnsureTrailingSlash('$(NuGetPackageRoot)'))dotnet-ef/$(DotnetEfVersion)/tools/net8.0/any/dotnet-ef.dll</_Parameter2>
1010
</AssemblyAttribute>
1111
<AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute">
1212
<_Parameter1>TestPackageRestorePath</_Parameter1>

src/ProjectTemplates/Web.ProjectTemplates/BlazorWeb-CSharp.csproj.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<!--#if (IndividualLocalAuth && !UseLocalDB) -->
1414
<ItemGroup>
15-
<None Update="app.db" CopyToOutputDirectory="PreserveNewest" ExcludeFromSingleFile="true" />
15+
<None Update="Data\app.db" CopyToOutputDirectory="PreserveNewest" ExcludeFromSingleFile="true" />
1616
</ItemGroup>
1717

1818
<!--#endif -->

src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/.template.config/template.json

+18-16
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@
5454
{
5555
"condition": "(!UseWebAssembly)",
5656
"exclude": [
57-
"BlazorWeb-CSharp/wwwroot/appsettings.Development.json",
58-
"BlazorWeb-CSharp/wwwroot/appsettings.json",
5957
"BlazorWeb-CSharp.Client/**",
6058
"*.sln"
6159
],
@@ -67,7 +65,8 @@
6765
"condition": "(UseWebAssembly && InteractiveAtRoot)",
6866
"rename": {
6967
"BlazorWeb-CSharp/Components/Layout/": "./BlazorWeb-CSharp.Client/Layout/",
70-
"BlazorWeb-CSharp/Components/Pages/": "./BlazorWeb-CSharp.Client/Pages/",
68+
"BlazorWeb-CSharp/Components/Pages/Home.razor": "./BlazorWeb-CSharp.Client/Pages/Home.razor",
69+
"BlazorWeb-CSharp/Components/Pages/Weather.razor": "./BlazorWeb-CSharp.Client/Pages/Weather.razor",
7170
"BlazorWeb-CSharp/Components/Routes.razor": "./BlazorWeb-CSharp.Client/Routes.razor"
7271
}
7372
},
@@ -101,6 +100,7 @@
101100
{
102101
"condition": "(!SampleContent)",
103102
"exclude": [
103+
"BlazorWeb-CSharp/Components/Pages/Auth.*",
104104
"BlazorWeb-CSharp/Components/Pages/Counter.*",
105105
"BlazorWeb-CSharp/Components/Pages/Weather.*",
106106
"BlazorWeb-CSharp/Components/Layout/NavMenu.*",
@@ -113,12 +113,8 @@
113113
{
114114
"condition": "(!IndividualLocalAuth)",
115115
"exclude": [
116-
"BlazorWeb-CSharp/Components/Identity/**",
117-
"BlazorWeb-CSharp/Components/Layout/ManageLayout.razor",
118-
"BlazorWeb-CSharp/Components/Layout/ManageNavMenu.razor",
119-
"BlazorWeb-CSharp/Components/Pages/Account/**",
116+
"BlazorWeb-CSharp/Components/Account/**",
120117
"BlazorWeb-CSharp/Data/**",
121-
"BlazorWeb-CSharp/Identity/**",
122118
"BlazorWeb-CSharp.Client/PersistentAuthenticationStateProvider.cs",
123119
"BlazorWeb-CSharp.Client/UserInfo.cs",
124120
"BlazorWeb-CSharp.Client/Pages/Auth.razor"
@@ -127,7 +123,7 @@
127123
{
128124
"condition": "(!(IndividualLocalAuth && !UseLocalDB))",
129125
"exclude": [
130-
"BlazorWeb-CSharp/app.db"
126+
"BlazorWeb-CSharp/Data/app.db"
131127
]
132128
},
133129
{
@@ -139,19 +135,19 @@
139135
{
140136
"condition": "(!(IndividualLocalAuth && UseServer && UseWebAssembly))",
141137
"exclude": [
142-
"BlazorWeb-CSharp/Identity/PersistingRevalidatingAuthenticationStateProvider.cs"
138+
"BlazorWeb-CSharp/Components/Account/PersistingRevalidatingAuthenticationStateProvider.cs"
143139
]
144140
},
145141
{
146142
"condition": "(!(IndividualLocalAuth && UseServer && !UseWebAssembly))",
147143
"exclude": [
148-
"BlazorWeb-CSharp/Identity/IdentityRevalidatingAuthenticationStateProvider.cs"
144+
"BlazorWeb-CSharp/Components/Account/IdentityRevalidatingAuthenticationStateProvider.cs"
149145
]
150146
},
151147
{
152148
"condition": "(!(IndividualLocalAuth && !UseServer && UseWebAssembly))",
153149
"exclude": [
154-
"BlazorWeb-CSharp/Identity/PersistingServerAuthenticationStateProvider.cs"
150+
"BlazorWeb-CSharp/Components/Account/PersistingServerAuthenticationStateProvider.cs"
155151
]
156152
},
157153
{
@@ -189,6 +185,12 @@
189185
"exclude": [
190186
"BlazorWeb-CSharp/Data/SqlServer/**"
191187
]
188+
},
189+
{
190+
"condition": "(IndividualLocalAuth && UseWebAssembly)",
191+
"rename": {
192+
"BlazorWeb-CSharp/Components/Account/Shared/RedirectToLogin.razor": "BlazorWeb-CSharp.Client/RedirectToLogin.razor"
193+
}
192194
}
193195
]
194196
}
@@ -250,7 +252,7 @@
250252
"sourceVariableName": "kestrelHttpPort",
251253
"fallbackVariableName": "kestrelHttpPortGenerated"
252254
},
253-
"replaces": "5000"
255+
"replaces": "5500"
254256
},
255257
"kestrelHttpsPort": {
256258
"type": "parameter",
@@ -272,7 +274,7 @@
272274
"sourceVariableName": "kestrelHttpsPort",
273275
"fallbackVariableName": "kestrelHttpsPortGenerated"
274276
},
275-
"replaces": "5001"
277+
"replaces": "5501"
276278
},
277279
"iisHttpPort": {
278280
"type": "parameter",
@@ -349,7 +351,7 @@
349351
"defaultValue": "InteractivePerPage",
350352
"displayName": "_Interactivity location",
351353
"description": "Chooses which components will have interactive rendering enabled",
352-
"isEnabled": "(InteractivityPlatform != \"None\" && auth == \"None\")",
354+
"isEnabled": "(InteractivityPlatform != \"None\")",
353355
"choices": [
354356
{
355357
"choice": "InteractivePerPage",
@@ -413,7 +415,7 @@
413415
"AllInteractive": {
414416
"type": "parameter",
415417
"datatype": "bool",
416-
"isEnabled": "(InteractivityPlatform != \"None\" && auth == \"None\")",
418+
"isEnabled": "(InteractivityPlatform != \"None\")",
417419
"defaultValue": "false",
418420
"displayName": "_Enable interactive rendering globally throughout the site",
419421
"description": "Configures whether to make every page interactive by applying an interactive render mode at the top level. If false, pages will use static server rendering by default, and can be marked interactive on a per-page or per-component basis."

0 commit comments

Comments
 (0)