Skip to content
Merged
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
Binary file added .assets/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
57 changes: 30 additions & 27 deletions .build/release.props
Original file line number Diff line number Diff line change
@@ -1,35 +1,38 @@
<Project>

<PropertyGroup>
<Authors>Arturo Martinez</Authors>
<Company>DarkLoop</Company>
<PackageId>DarkLoop.Azure.Functions.Authorize</PackageId>
<IsPreview>false</IsPreview>
<AssemblyVersion>3.0.0.0</AssemblyVersion>
<Version>3.1.3</Version>
<FileVersion>$(Version).0</FileVersion>
<RepositoryUrl>https://github.com/dark-loop/functions-authorize</RepositoryUrl>
<License>https://github.com/dark-loop/functions-authorize/blob/master/LICENSE</License>
<RepositoryType>Git</RepositoryType>
<PackageTags>AuthorizeAttribute, Authorize, Azure Functions, Azure, Bearer, JWT, Policy based authorization</PackageTags>
<PackageIconUrl>https://en.gravatar.com/userimage/22176525/45f25acea686a783e5b2ca172d72db71.png</PackageIconUrl>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>dl-sftwr-sn-key.snk</AssemblyOriginatorKeyFile>
<IsPackable>true</IsPackable>
<Description>Azure Functions V3 authentication extensions to enable authentication and authorization on a per function basis based on ASPNET Core frameworks.</Description>
<PackageReadmeFile>README.md</PackageReadmeFile>
</PropertyGroup>
<PropertyGroup>
<PackageId>$(AssmeblyName)</PackageId>
<Authors>Arturo Martinez</Authors>
<Company>DarkLoop</Company>
<Copyright>DarkLoop - All rights reserved</Copyright>
<Product>DarkLoop's Azure Functions Authorization</Product>
<IsPreview>true</IsPreview>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
<Version>4.0.0</Version>
<FileVersion>$(Version).0</FileVersion>
<RepositoryUrl>https://github.com/dark-loop/functions-authorize</RepositoryUrl>
<License>https://github.com/dark-loop/functions-authorize/blob/master/LICENSE</License>
<RepositoryType>Git</RepositoryType>
<PackageTags>AuthorizeAttribute, Authorize, Azure Functions, Azure, Bearer, JWT, Policy based authorization</PackageTags>
<PackageIconUrl>icons/icon.png</PackageIconUrl>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>../dl-sftwr-sn-key.snk</AssemblyOriginatorKeyFile>
<PublicKey>0024000004800000940000000602000000240000525341310004000001000100791e7f618a12452d7ced5310f6203d0d227f9d26b146555e7e67a1801695dcf7c552421620a662f54b072f7be1efa885c074d4b9c76a4d6d154721d1c3b1f39164cfaf9ebdf9b7672ff320c89c5a64c90e25330f90a12bf42a1c57b70523e785167dbbfb7a0fdc9eb8d15112f758b89bab51953b08cfb2218095bc45171c99c5</PublicKey>
<IsPackable>true</IsPackable>
<PackageReadmeFile>README.md</PackageReadmeFile>
</PropertyGroup>

<PropertyGroup>
<Revision>$(BuildNumber.Substring($([MSBuild]::Add($(BuildNumber.LastIndexOf('.')), 1))))</Revision>
<DateNumber>$([System.DateTime]::Now.ToString('yyMMdd'))</DateNumber>
<BuildIDNumber>$(DateNumber)-$(Revision)</BuildIDNumber>
<PreviewVersion Condition=" '$(IsPreview)' == 'true' ">-preview-$(BuildIDNumber)</PreviewVersion>
<Version>$(Version)$(PreviewVersion)</Version>
</PropertyGroup>
<PropertyGroup>
<Revision>$(BuildNumber.Substring($([MSBuild]::Add($(BuildNumber.LastIndexOf('.')), 1))))</Revision>
<DateNumber>$([System.DateTime]::Now.ToString('yyMMdd'))</DateNumber>
<BuildIDNumber>$(DateNumber)-$(Revision)</BuildIDNumber>
<PreviewVersion Condition=" '$(IsPreview)' == 'true' ">-preview-$(BuildIDNumber)</PreviewVersion>
<Version>$(Version)$(PreviewVersion)</Version>
</PropertyGroup>

<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)..\README.md" Pack="true" PackagePath="\" />
<None Include="../../.assets/icon.png" Pack="true" PackagePath="icons" />
<None Include="README.md" Pack="true" PackagePath="" />
</ItemGroup>

</Project>
2 changes: 2 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
[*.cs]

file_header_template = <copyright file="{fileName}" company="DarkLoop" author="Arturo Martinez">\n Copyright (c) DarkLoop. All rights reserved.\n</copyright>

# CS0618: Type or member is obsolete
dotnet_diagnostic.CS0618.severity = silent
78 changes: 49 additions & 29 deletions Functions-Authorize.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,69 +3,89 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.32804.182
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D96FC724-6F6E-400E-BCA9-21A8FD44CA1C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{051D16F8-54BB-482B-B2A9-47E2DA89E6DB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".build", ".build", "{1CED3FA2-C2EF-4A83-A9D6-B5193EF46B2C}"
ProjectSection(SolutionItems) = preProject
.build\release.props = .build\release.props
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DarkLoop.Azure.Functions.Authorize", "src\DarkLoop.Azure.Functions.Authorize\DarkLoop.Azure.Functions.Authorize.csproj", "{47791FF8-5FEA-42BC-8192-5A59D23ADE92}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DarkLoop.Azure.Functions.Authorize.Tests", "test\DarkLoop.Azure.Functions.Authorize.Tests\DarkLoop.Azure.Functions.Authorize.Tests.csproj", "{CB2B4A20-7882-4003-ADEF-E95F72DA3146}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".root", ".root", "{3A9A7517-71B4-429E-A91E-2DB7F695A363}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
.gitignore = .gitignore
LICENSE = LICENSE
README.md = README.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{53EC585B-CE9B-4E7D-B2E2-F7A9B6DA0FE7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DarkLoop.Azure.Functions.Authorize.SampleFunctions", "sample\DarkLoop.Azure.Functions.Authorize.SampleFunctions\DarkLoop.Azure.Functions.Authorize.SampleFunctions.csproj", "{9AB1B297-FA02-406C-A3E2-979A7CC5C706}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6C3D01C4-AFF0-4AE3-ACA1-FDCDF8FD6CE1}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
README.md = README.md
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Darkloop.Azure.Functions.Authorize.SampleFunctions.V4", "sample\Darkloop.Azure.Functions.Authorize.SampleFunctions.V4\Darkloop.Azure.Functions.Authorize.SampleFunctions.V4.csproj", "{0E97CAE1-D5E8-462D-B513-7EF2797C7D48}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleInProcFunctions.V4", "sample\SampleInProcFunctions.V4\SampleInProcFunctions.V4.csproj", "{0C7F5C24-C2B2-46DC-8DB7-B58BED3DDE43}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleIsolatedFunctions.V4", "sample\SampleIsolatedFunctions.V4\SampleIsolatedFunctions.V4.csproj", "{004B35A8-CD74-4E05-B601-9AFFD31427FF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Abstractions.Tests", "test\Abstractions.Tests\Abstractions.Tests.csproj", "{D29BBE67-EE8E-4085-A004-F12E68FD7FB6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{284270FA-3689-46E6-B74C-249EA8981B78}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DarkLoop.Azure.Functions.Authorization.Abstractions", "src\abstractions\DarkLoop.Azure.Functions.Authorization.Abstractions.csproj", "{323DA8F9-DC74-491D-9B52-8F58ABAB2B47}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DarkLoop.Azure.Functions.Authorize", "src\in-proc\DarkLoop.Azure.Functions.Authorize.csproj", "{5766D189-64CA-4735-8378-5D5B529F8EB1}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DarkLoop.Azure.Functions.Authorization.Isolated", "src\isolated\DarkLoop.Azure.Functions.Authorization.Isolated.csproj", "{05468E2C-BFCF-49A4-A083-8BEE26767FA5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".assets", ".assets", "{2A6C3077-8AC9-49AA-919E-88B0BF1BFECA}"
ProjectSection(SolutionItems) = preProject
.assets\icon.png = .assets\icon.png
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{47791FF8-5FEA-42BC-8192-5A59D23ADE92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{47791FF8-5FEA-42BC-8192-5A59D23ADE92}.Debug|Any CPU.Build.0 = Debug|Any CPU
{47791FF8-5FEA-42BC-8192-5A59D23ADE92}.Release|Any CPU.ActiveCfg = Release|Any CPU
{47791FF8-5FEA-42BC-8192-5A59D23ADE92}.Release|Any CPU.Build.0 = Release|Any CPU
{CB2B4A20-7882-4003-ADEF-E95F72DA3146}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CB2B4A20-7882-4003-ADEF-E95F72DA3146}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CB2B4A20-7882-4003-ADEF-E95F72DA3146}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CB2B4A20-7882-4003-ADEF-E95F72DA3146}.Release|Any CPU.Build.0 = Release|Any CPU
{9AB1B297-FA02-406C-A3E2-979A7CC5C706}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9AB1B297-FA02-406C-A3E2-979A7CC5C706}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9AB1B297-FA02-406C-A3E2-979A7CC5C706}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9AB1B297-FA02-406C-A3E2-979A7CC5C706}.Release|Any CPU.Build.0 = Release|Any CPU
{0E97CAE1-D5E8-462D-B513-7EF2797C7D48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E97CAE1-D5E8-462D-B513-7EF2797C7D48}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E97CAE1-D5E8-462D-B513-7EF2797C7D48}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E97CAE1-D5E8-462D-B513-7EF2797C7D48}.Release|Any CPU.Build.0 = Release|Any CPU
{0C7F5C24-C2B2-46DC-8DB7-B58BED3DDE43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C7F5C24-C2B2-46DC-8DB7-B58BED3DDE43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C7F5C24-C2B2-46DC-8DB7-B58BED3DDE43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C7F5C24-C2B2-46DC-8DB7-B58BED3DDE43}.Release|Any CPU.Build.0 = Release|Any CPU
{004B35A8-CD74-4E05-B601-9AFFD31427FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{004B35A8-CD74-4E05-B601-9AFFD31427FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{004B35A8-CD74-4E05-B601-9AFFD31427FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{004B35A8-CD74-4E05-B601-9AFFD31427FF}.Release|Any CPU.Build.0 = Release|Any CPU
{D29BBE67-EE8E-4085-A004-F12E68FD7FB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D29BBE67-EE8E-4085-A004-F12E68FD7FB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D29BBE67-EE8E-4085-A004-F12E68FD7FB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D29BBE67-EE8E-4085-A004-F12E68FD7FB6}.Release|Any CPU.Build.0 = Release|Any CPU
{323DA8F9-DC74-491D-9B52-8F58ABAB2B47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{323DA8F9-DC74-491D-9B52-8F58ABAB2B47}.Debug|Any CPU.Build.0 = Debug|Any CPU
{323DA8F9-DC74-491D-9B52-8F58ABAB2B47}.Release|Any CPU.ActiveCfg = Release|Any CPU
{323DA8F9-DC74-491D-9B52-8F58ABAB2B47}.Release|Any CPU.Build.0 = Release|Any CPU
{5766D189-64CA-4735-8378-5D5B529F8EB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5766D189-64CA-4735-8378-5D5B529F8EB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5766D189-64CA-4735-8378-5D5B529F8EB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5766D189-64CA-4735-8378-5D5B529F8EB1}.Release|Any CPU.Build.0 = Release|Any CPU
{05468E2C-BFCF-49A4-A083-8BEE26767FA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{05468E2C-BFCF-49A4-A083-8BEE26767FA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{05468E2C-BFCF-49A4-A083-8BEE26767FA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{05468E2C-BFCF-49A4-A083-8BEE26767FA5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{47791FF8-5FEA-42BC-8192-5A59D23ADE92} = {D96FC724-6F6E-400E-BCA9-21A8FD44CA1C}
{CB2B4A20-7882-4003-ADEF-E95F72DA3146} = {051D16F8-54BB-482B-B2A9-47E2DA89E6DB}
{9AB1B297-FA02-406C-A3E2-979A7CC5C706} = {53EC585B-CE9B-4E7D-B2E2-F7A9B6DA0FE7}
{0E97CAE1-D5E8-462D-B513-7EF2797C7D48} = {53EC585B-CE9B-4E7D-B2E2-F7A9B6DA0FE7}
{0C7F5C24-C2B2-46DC-8DB7-B58BED3DDE43} = {53EC585B-CE9B-4E7D-B2E2-F7A9B6DA0FE7}
{004B35A8-CD74-4E05-B601-9AFFD31427FF} = {53EC585B-CE9B-4E7D-B2E2-F7A9B6DA0FE7}
{D29BBE67-EE8E-4085-A004-F12E68FD7FB6} = {051D16F8-54BB-482B-B2A9-47E2DA89E6DB}
{323DA8F9-DC74-491D-9B52-8F58ABAB2B47} = {284270FA-3689-46E6-B74C-249EA8981B78}
{5766D189-64CA-4735-8378-5D5B529F8EB1} = {284270FA-3689-46E6-B74C-249EA8981B78}
{05468E2C-BFCF-49A4-A083-8BEE26767FA5} = {284270FA-3689-46E6-B74C-249EA8981B78}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {546E3A6C-060C-4630-BEEE-46A1F8715347}
Expand Down
97 changes: 14 additions & 83 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,89 +1,16 @@
# functions-authorize
Bringing AuthorizeAttribute Behavior to Azure Functions v3 and v4 (In-Process)
Extension bringing AuthorizeAttribute Behavior to Azure Functions In-Proc and Isolated mode. For the latter is only available with ASPNET Core integration.

It hooks into .NET Core dependency injection container to enable authentication and authorization in the same way ASP.NET Core does.

## Getting Started
- [Azure Functions V3+ In-Proc mode](./in-proc/README.md)
- [Azure Functions V4 Isolated mode with ASPNET Core integration](./isolated/README.md)

## License
This projects is open source and may be redistributed under the terms of the [Apache 2.0](http://opensource.org/licenses/Apache-2.0) license.

## Using the package
### Installing the package
`dotnet add package DarkLoop.Azure.Functions.Authorize`

### Setting up authentication
The goal is to utilize the same authentication framework provided for ASP.NET Core
```c#
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using MyFunctionAppNamespace;

[assembly: FunctionsStartup(typeof(Startup))]
namespace MyFunctionAppNamespace
{
class Startup : FunctionsStartup
{
public void Configure(IFunctionsHostBuilder builder)
{
builder
.AddAuthentication(options =>
{
options.DefaultAuthenticationScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddOpenIdConnect(options =>
{
options.ClientId = "<my-client-id>";
// ... more options here
})
.AddJwtBearer(options =>
{
options.Audience = "<my-audience>";
// ... more options here
});

builder
.AddAuthorization(options =>
{
options.AddPolicy("OnlyAdmins", policyBuilder =>
{
// configure my policy requirements
});
});
}
}
}
```

No need to register the middleware the way we do for ASP.NET Core applications.

### Using the attribute
And now lets use `FunctionAuthorizeAttribute` the same way we use `AuthorizeAttribute` in our ASP.NET Core applications.
```C#
public class Functions
{
[FunctionAuthorize]
[FunctionName("get-record")]
public async Task<IActionResult> GetRecord(
[HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
ILogger log)
{
var user = req.HttpContext.User;
var record = GetUserData(user.Identity.Name);
return new OkObjectResult(record);
}

[FunctionAuthorize(Policy = "OnlyAdmins")]
[FunctionName("get-all-records")]
public async Task<IActionResult>(
[HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
ILogger log)
{
var records = GetAllData();
return new OkObjectResult(records);
}
}
```
##

## Package Status
### Releases
[![Nuget](https://img.shields.io/nuget/v/DarkLoop.Azure.Functions.Authorize.svg)](https://www.nuget.org/packages/DarkLoop.Azure.Functions.Authorize)

Expand All @@ -93,32 +20,36 @@ public class Functions
## Change log
Adding change log starting with version 3.1.3

### 4.0.0
Information will be added soon.

### 3.1.3
3.1.3 and lower versions only support Azure Functions V3 In-Proc mode. Starting from 4.0.0, support for Azure Functions V4 Isolated mode with ASPNET Core integration is added.
- #### Support for disabling `FunctionAuthorize` effect at the application level.
Adding support for disabling the effect of `[FunctionAuthorize]` attribute at the application level.
This is useful when wanting to disable authorization for a specific environment, such as local development.

When configuring services, you can now configure `FunctionsAuthorizationOptions`.
```c#
```csharp
builder.Services.Configure<FunctionsAuthorizationOptions>(options =>
options.DisableAuthorization = Configuration.GetValue<bool>("AuthOptions:DisableAuthorization"));
```

Optionally you can bind it to configuration to rely on providers like User Secrets or Azure App Configuration to disable and re-enable without having to restart your application:
```c#
```csharp
builder.Services.Configure<FunctionsAuthorizationOptions>(
Configuration.GetSection("FunctionsAuthorization"));
```

For function apps targeting .NET 7 or greater, you can also use `AuthorizationBuilder` to set this value:
```c#
```csharp
builder.Services
.AddAuthorizationBuilder()
.DisableAuthorization(Configuration.GetValue<bool>("AuthOptions:DisableAuthorization"));
```

It's always recommended to encapsulate this logic within checks for environments to ensure that if the configuration setting is unintentionally moved to a non-desired environment, it would not affect security of our HTTP triggered functions. This change adds a helper method to identify if you are running the function app in the local environment:
```c#
```csharp
if (builder.IsLocalAuthorizationContext())
{
builder.Services.Configure<FunctionsAuthorizationOptions>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
using System.Text;
using Microsoft.AspNetCore.Authorization;

namespace Darkloop.Azure.Functions.Authorize.SampleFunctions.V4
namespace DarkLoop.Azure.Functions.Authorize.SampleFunctions.V4
{
public static class TestFunction
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<UserSecretsId>51dc0b9d-8e74-45ec-aebc-1d3d6934faf5</UserSecretsId>
</PropertyGroup>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\DarkLoop.Azure.Functions.Authorize\DarkLoop.Azure.Functions.Authorize.csproj" />
<ProjectReference Include="..\..\src\in-proc\DarkLoop.Azure.Functions.Authorize.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
Expand Down
Loading