Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
.vs
.vs.superpowers/
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>

<AssemblyVersion>6.7.3.0</AssemblyVersion>
Expand Down
2 changes: 2 additions & 0 deletions custom-backends/dotnetIsolated-mssql/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Durable Functions Monitor .Net Isolated for MSSQL

> **Breaking change: .NET 10.** Starting with this release the package targets .NET 10. If you deployed DfMon from the NuGet package (e.g. via the *Deploy to Azure* button) on a Function App configured for .NET 8, set the app's .NET version to 10 (`az functionapp config set --net-framework-version v10.0 -g <resource-group> -n <app-name>`) before or right after upgrading, otherwise the app will fail to start.

Custom Durable Functions Monitor .NET Isolated backend project to be used with [Durable Task SQL Provider](https://microsoft.github.io/durabletask-mssql/#/).

## How to run locally
Expand Down
2 changes: 1 addition & 1 deletion custom-backends/dotnetIsolated-mssql/arm-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('functionAppName'))]",
"siteConfig": {
"netFrameworkVersion": "v8.0",
"netFrameworkVersion": "v10.0",
"appSettings": [
{
"name": "DFM_HUB_NAME",
Expand Down
8 changes: 4 additions & 4 deletions custom-backends/dotnetIsolated/Dfm.DotNetIsolated.csproj
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DurableFunctionsMonitor.DotNetIsolated" Version="6.7.3" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.2.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.9.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.51.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.16.3" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.2" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="2.0.7" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
Expand Down
1,205 changes: 1,205 additions & 0 deletions docs/superpowers/plans/2026-09-28-dotnet10-multiarch-docker.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>

<AssemblyVersion>6.8.1.0</AssemblyVersion>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>

<AssemblyVersion>6.8.1.0</AssemblyVersion>
Expand Down
2 changes: 2 additions & 0 deletions durablefunctionsmonitor.dotnetisolated/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# DurableFunctionsMonitor.DotNetIsolated

> **Breaking change: .NET 10.** Starting with this release the package targets .NET 10. If you deployed DfMon from the NuGet package (e.g. via the *Deploy to Azure* button) on a Function App configured for .NET 8, set the app's .NET version to 10 (`az functionapp config set --net-framework-version v10.0 -g <resource-group> -n <app-name>`) before or right after upgrading, otherwise the app will fail to start.

"Standalone" [.NET 7 Isolated](https://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide) version of DurableFunctionsMonitor backend.

## How to deploy to Azure
Expand Down
2 changes: 1 addition & 1 deletion durablefunctionsmonitor.dotnetisolated/arm-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('functionAppName'))]",
"siteConfig": {
"netFrameworkVersion": "v8.0",
"netFrameworkVersion": "v10.0",
"appSettings": [
{
"name": "DFM_HUB_NAME",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>

<AssemblyVersion>6.8.1.0</AssemblyVersion>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ public class AuthTests
[TestInitialize]
public void TestInit()
{
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_NONCE, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_NONCE, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_USER_NAMES, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_APP_ROLES, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_FULL_ACCESS_APP_ROLES, null);
Expand Down Expand Up @@ -218,7 +218,7 @@ public async Task RespectsTaskHubNameEnvVariableFromHostJson()
Environment.SetEnvironmentVariable(hubNameVariable, hubName);

Environment.SetEnvironmentVariable(EnvVariableNames.WEBSITE_AUTH_CLIENT_ID, $"SomeClientId{DateTime.Now}");
Environment.SetEnvironmentVariable(EnvVariableNames.WEBSITE_AUTH_OPENID_ISSUER, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.WEBSITE_AUTH_OPENID_ISSUER, null);

// Act

Expand Down Expand Up @@ -248,7 +248,7 @@ public void ReturnsUnauthorizedResultIfUserNotWhitelisted()

string userName = "tino@contoso.com";

Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_USER_NAMES, "user1@contoso.com,user2@contoso.com");

request.AddIdentity(new ClaimsIdentity(new Claim[] {
Expand All @@ -268,9 +268,9 @@ public void ReturnsUnauthorizedResultIfUserNotWhitelisted()
}

[TestMethod]
[DataRow("role1,role2", "", "", DisplayName = "DFM_ALLOWED_APP_ROLES")]
[DataRow("", "role1,role2", "", DisplayName = "DFM_ALLOWED_FULL_ACCESS_APP_ROLES")]
[DataRow("", "", "role1,role2", DisplayName = "DFM_ALLOWED_READ_ONLY_APP_ROLES")]
[DataRow("role1,role2", null, null, DisplayName = "DFM_ALLOWED_APP_ROLES")]
[DataRow(null, "role1,role2", null, DisplayName = "DFM_ALLOWED_FULL_ACCESS_APP_ROLES")]
[DataRow(null, null, "role1,role2", DisplayName = "DFM_ALLOWED_READ_ONLY_APP_ROLES")]
public void ReturnsUnauthorizedResultIfUserIsNotInAppRole(string appRoles, string fullAccessAppRoles, string readOnlyAppRoles)
{
// Arrange
Expand All @@ -282,8 +282,8 @@ public void ReturnsUnauthorizedResultIfUserIsNotInAppRole(string appRoles, strin

string userName = "tino@contoso.com";

Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_USER_NAMES, "");
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_USER_NAMES, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_APP_ROLES, appRoles);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_FULL_ACCESS_APP_ROLES, fullAccessAppRoles);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_READ_ONLY_APP_ROLES, readOnlyAppRoles);
Expand All @@ -307,9 +307,9 @@ public void ReturnsUnauthorizedResultIfUserIsNotInAppRole(string appRoles, strin
}

[TestMethod]
[DataRow("role1,role2", "", "", DfmMode.Normal, DisplayName = "DFM_ALLOWED_APP_ROLES")]
[DataRow("", "role1,role2", "", DfmMode.Normal, DisplayName = "DFM_ALLOWED_FULL_ACCESS_APP_ROLES")]
[DataRow("", "", "role1,role2", DfmMode.ReadOnly, DisplayName = "DFM_ALLOWED_READ_ONLY_APP_ROLES")]
[DataRow("role1,role2", null, null, DfmMode.Normal, DisplayName = "DFM_ALLOWED_APP_ROLES")]
[DataRow(null, "role1,role2", null, DfmMode.Normal, DisplayName = "DFM_ALLOWED_FULL_ACCESS_APP_ROLES")]
[DataRow(null, null, "role1,role2", DfmMode.ReadOnly, DisplayName = "DFM_ALLOWED_READ_ONLY_APP_ROLES")]
public async Task ReturnsAuthorizedIfUserIsInAppRole(string appRoles, string fullAccessAppRoles, string readOnlyAppRoles, DfmMode expectedMode)
{
// Arrange
Expand All @@ -321,8 +321,8 @@ public async Task ReturnsAuthorizedIfUserIsInAppRole(string appRoles, string ful

string userName = "tino@contoso.com";

Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_USER_NAMES, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_USER_NAMES, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_APP_ROLES, appRoles);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_FULL_ACCESS_APP_ROLES, fullAccessAppRoles);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_READ_ONLY_APP_ROLES, readOnlyAppRoles);
Expand Down Expand Up @@ -389,7 +389,7 @@ public async Task ValidatesTokenWithoutEasyAuthsHelp()
Auth.MockedJwtSecurityTokenHandler = jwtHandlerMoq.Object;
Auth.GetSigningKeysTask = Task.FromResult(securityKeys);

Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);
Environment.SetEnvironmentVariable(EnvVariableNames.WEBSITE_AUTH_CLIENT_ID, audience);
Environment.SetEnvironmentVariable(EnvVariableNames.WEBSITE_AUTH_OPENID_ISSUER, issuer);

Expand Down Expand Up @@ -419,7 +419,7 @@ public async Task LoadsListOfTablesFromTableStorage()
request.AddCookie(Globals.XsrfTokenCookieAndHeaderName, xsrfToken);
request.Headers.Add(Globals.XsrfTokenCookieAndHeaderName, xsrfToken);

Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);

var tableClientMoq = new Mock<ITableClient>();

Expand Down Expand Up @@ -466,7 +466,7 @@ public void LoadsListOfTablesFromAlternativeStorage()

Auth.AlternativeConnectionStringNames = new[] { connName };

Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);

var tableClientMoq = new Mock<ITableClient>();

Expand Down Expand Up @@ -617,7 +617,7 @@ public async Task Returns_DFM_HUB_NAME_AsCaseInsensitiveHashSet()

// Assert

Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);

Assert.IsTrue(hubNames.Contains("mYtASKhUB"));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ public class GlobalsTest
[TestInitialize]
public void TestInit()
{
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_NONCE, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.WEBSITE_AUTH_CLIENT_ID, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.WEBSITE_AUTH_OPENID_ISSUER, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_NONCE, null);
Environment.SetEnvironmentVariable(EnvVariableNames.WEBSITE_AUTH_CLIENT_ID, null);
Environment.SetEnvironmentVariable(EnvVariableNames.WEBSITE_AUTH_OPENID_ISSUER, null);
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class IdSuggestionsTests
[TestInitialize]
public void TestInit()
{
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);
TableClient.MockedTableClient = null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class ServeStaticsTests
[TestInitialize]
public void TestInit()
{
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_NONCE, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_NONCE, null);

Shared.CopyFolder(Path.Join("..", "..", "..", "..", "..", "durablefunctionsmonitor.dotnetisolated", "DfmStatics"), "DfmStatics");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ public class SetupTests
public void ThrowErrorIfAppRolesOverlapInConfiguration()
{
// Arrange
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, string.Empty);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_USER_NAMES, "");
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_HUB_NAME, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_USER_NAMES, null);
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_APP_ROLES, "role1,role2");
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_FULL_ACCESS_APP_ROLES, "role2");
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_READ_ONLY_APP_ROLES, "");
Environment.SetEnvironmentVariable(EnvVariableNames.DFM_ALLOWED_READ_ONLY_APP_ROLES, null);

// Act & Assert
Assert.ThrowsException<System.NotSupportedException>(() => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>

<IsPackable>false</IsPackable>
</PropertyGroup>
Expand Down