From 4a3963b69780db28d2fce4945e6309b75f68505c Mon Sep 17 00:00:00 2001 From: Tudor Stanciu Date: Thu, 2 Mar 2023 18:54:27 +0200 Subject: [PATCH] Netmash.Security.Authentication.Tuitio package update --- .../AuthenticationExtensions.cs | 2 +- ...mash.Security.Authentication.Tuitio.csproj | 23 +++++++-- .../README.md | 44 ++++++++++++++++++ .../ReleaseNotes.txt | 3 ++ .../netmash.png | Bin 0 -> 12141 bytes 5 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 src/security/authentication/Netmash.Security.Authentication.Tuitio/README.md create mode 100644 src/security/authentication/Netmash.Security.Authentication.Tuitio/ReleaseNotes.txt create mode 100644 src/security/authentication/Netmash.Security.Authentication.Tuitio/netmash.png diff --git a/src/security/authentication/Netmash.Security.Authentication.Tuitio/AuthenticationExtensions.cs b/src/security/authentication/Netmash.Security.Authentication.Tuitio/AuthenticationExtensions.cs index b855587..efeb85e 100644 --- a/src/security/authentication/Netmash.Security.Authentication.Tuitio/AuthenticationExtensions.cs +++ b/src/security/authentication/Netmash.Security.Authentication.Tuitio/AuthenticationExtensions.cs @@ -19,7 +19,7 @@ namespace Netmash.Security.Authentication.Tuitio Validate(tuitioBaseAddress, options); // Tuitio - services.UseIdentityServices(tuitioBaseAddress); + services.UseTuitioServices(tuitioBaseAddress); services.AddSingleton(options); // configure authentication diff --git a/src/security/authentication/Netmash.Security.Authentication.Tuitio/Netmash.Security.Authentication.Tuitio.csproj b/src/security/authentication/Netmash.Security.Authentication.Tuitio/Netmash.Security.Authentication.Tuitio.csproj index 139a251..329d746 100644 --- a/src/security/authentication/Netmash.Security.Authentication.Tuitio/Netmash.Security.Authentication.Tuitio.csproj +++ b/src/security/authentication/Netmash.Security.Authentication.Tuitio/Netmash.Security.Authentication.Tuitio.csproj @@ -2,11 +2,17 @@ net6.0 - Add authentication handler with Tuitio - https://lab.code-rove.com/gitea/bricks/netmash + Netmash.Security.Authentication.Tuitio configures authentication with a Tuitio instance in a .NET environment for a .NET API. + https://lab.code-rove.com/gitea/bricks/netmash/src/branch/master/src/security/authentication/Netmash.Security.Authentication.Tuitio https://lab.code-rove.com/gitea/bricks/netmash Git - Netmash Authentication Tuitio + MIT + $([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/ReleaseNotes.txt")) + Netmash Tuitio HomeLab CodeRove + netmash.png + README.md + Toodle HomeLab + Toodle Netmash 2.0.0 @@ -14,5 +20,16 @@ + + + + True + \ + + + True + \ + + diff --git a/src/security/authentication/Netmash.Security.Authentication.Tuitio/README.md b/src/security/authentication/Netmash.Security.Authentication.Tuitio/README.md new file mode 100644 index 0000000..063ec5d --- /dev/null +++ b/src/security/authentication/Netmash.Security.Authentication.Tuitio/README.md @@ -0,0 +1,44 @@ +# Netmash.Security.Authentication.Tuitio + +[Tuitio](https://lab.code-rove.com/gitea/tudor.stanciu/tuitio) is a simple identity server implementation focused strictly on the needs of my home lab. + +***Netmash.Security.Authentication.Tuitio*** is a NuGet package that configures authentication with a Tuitio instance in a .NET environment for a .NET API. +Once the package is installed, all the developer has to do is call the ```AddTuitioAuthentication``` method at application startup. After this step, the ```[Authorize]``` attribute can be added to any controller from application. + +**Code snippet:** +```c=! +public static void ConfigureServices(this IServiceCollection services, IConfiguration configuration) +{ + services.AddTuitioAuthentication("httpe:///tuitio/api/"); +} +``` + +## Package repository +Netmash.Security.Authentication.Tuitio can be installed from my self hosted NuGet feed: https://lab.code-rove.com/public-nuget-server/ + +## Installation + +### Visual Studio + +#### NuGet.config file +```xml=! + + + + + + + + +``` + +Configure the above file in the Visual Studio solution or set the new NuGet feed in NuGet Package Manager. After one of this steps, Netmash.Security.Authentication.Tuitio can be installed using NuGet Package Manager. + + +### CLI + +```bash=! +dotnet add package Netmash.Security.Authentication.Tuitio --source https://lab.code-rove.com/public-nuget-server/v3/index.json +``` + +Run the above command in a console open in a .NET project directory. \ No newline at end of file diff --git a/src/security/authentication/Netmash.Security.Authentication.Tuitio/ReleaseNotes.txt b/src/security/authentication/Netmash.Security.Authentication.Tuitio/ReleaseNotes.txt new file mode 100644 index 0000000..f2cef51 --- /dev/null +++ b/src/security/authentication/Netmash.Security.Authentication.Tuitio/ReleaseNotes.txt @@ -0,0 +1,3 @@ +2.0.0 release [2023-02-01 19:29] +◾ Tuitio rebranding +◾ Initial release of Netmash.Security.Authentication.Tuitio \ No newline at end of file diff --git a/src/security/authentication/Netmash.Security.Authentication.Tuitio/netmash.png b/src/security/authentication/Netmash.Security.Authentication.Tuitio/netmash.png new file mode 100644 index 0000000000000000000000000000000000000000..53d33712588534a5b84438fe22762bf07e279f41 GIT binary patch literal 12141 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 yv)TMpDvAk1Rmr8U%qdQ%