From ec98452bcb3c4047871941a7439ccc252745b41f Mon Sep 17 00:00:00 2001 From: sofietoft Date: Fri, 24 Jan 2025 09:31:53 +0100 Subject: [PATCH 1/7] small changes to the code --- 15/umbraco-cms/reference/security/two-factor-authentication.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/15/umbraco-cms/reference/security/two-factor-authentication.md b/15/umbraco-cms/reference/security/two-factor-authentication.md index 2b0291b8a4e..26ede524c84 100644 --- a/15/umbraco-cms/reference/security/two-factor-authentication.md +++ b/15/umbraco-cms/reference/security/two-factor-authentication.md @@ -86,8 +86,9 @@ public class UmbracoAppAuthenticator : ITwoFactorProvider { var member = _memberService.GetByKey(userOrMemberKey); + var applicationName = "My application name"; var twoFactorAuthenticator = new TwoFactorAuthenticator(); - SetupCode setupInfo = twoFactorAuthenticator.GenerateSetupCode("My application name", member.Username, secret, false); + SetupCode setupInfo = twoFactorAuthenticator.GenerateSetupCode(applicationName, member.Username, secret, false); return Task.FromResult(new QrCodeSetupData() { SetupCode = setupInfo, From 2a7b67832f0ade1b397380b03dcd2b0fe6db11c6 Mon Sep 17 00:00:00 2001 From: sofietoft Date: Fri, 24 Jan 2025 12:31:42 +0100 Subject: [PATCH 2/7] Update steps for the member guide --- .../security/two-factor-authentication.md | 4 +- .../security/images/2fa-member-backoffice.png | Bin 0 -> 88511 bytes .../images/2fa-members-configuration.png | Bin 0 -> 17175 bytes .../security/two-factor-authentication.md | 92 +++++++++++++----- 4 files changed, 70 insertions(+), 26 deletions(-) create mode 100644 15/umbraco-cms/reference/security/images/2fa-member-backoffice.png create mode 100644 15/umbraco-cms/reference/security/images/2fa-members-configuration.png diff --git a/13/umbraco-cms/reference/security/two-factor-authentication.md b/13/umbraco-cms/reference/security/two-factor-authentication.md index cd1fcb3158c..738cf0ae194 100644 --- a/13/umbraco-cms/reference/security/two-factor-authentication.md +++ b/13/umbraco-cms/reference/security/two-factor-authentication.md @@ -218,10 +218,10 @@ At this point, the 2FA is active, but no members have set up 2FA yet. The setup } ``` -10. [Optional] Customize the text fields and buttons to match your websites tone of voice. - {% endcode %} +10. [Optional] Customize the text fields and buttons to match your websites tone of voice. + ![The QR Code is shown along with a field to enter a value to set up the two factor authentication.](images/2fa-Members-QR-code.png) ### Test the set up for Members diff --git a/15/umbraco-cms/reference/security/images/2fa-member-backoffice.png b/15/umbraco-cms/reference/security/images/2fa-member-backoffice.png new file mode 100644 index 0000000000000000000000000000000000000000..af270105742f24077ec2e44482917ce199d15a3f GIT binary patch literal 88511 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 literal 0 HcmV?d00001 diff --git a/15/umbraco-cms/reference/security/two-factor-authentication.md b/15/umbraco-cms/reference/security/two-factor-authentication.md index 26ede524c84..6d97cb1ad9b 100644 --- a/15/umbraco-cms/reference/security/two-factor-authentication.md +++ b/15/umbraco-cms/reference/security/two-factor-authentication.md @@ -6,7 +6,12 @@ description: >- # Two-factor Authentication -Two-factor authentication (2FA) for Umbraco members is activated by implementing an `ITwoFactorProvider` interface and registering the implementation. The implementation can use third-party packages to archive for example support for authentication apps like Microsoft- or Google Authentication App. +This article includes guides for implementing two-factor authentication options for both backoffice users and website members: + +* [Two-Factor Authentication for Members](#two-factor-authentication-for-members) +* [Two-Factor Authentication for Users](#two-factor-authentication-for-users) + +Two-factor authentication (2FA) for Umbraco Users and Members is activated by implementing an `ITwoFactorProvider` interface and registering the implementation. The implementation can use third-party packages to support authentication apps like the Microsoft- or Google Authentication Apps. {% hint style="info" %} If you are using [Umbraco Cloud](https://umbraco.com/products/umbraco-cloud/), you can enable multi-factor authentication in Umbraco ID. For more information, see the [Multi-Factor Authentication](https://docs.umbraco.com/umbraco-cloud/set-up/multi-factor-authentication-on-cloud) article. @@ -14,19 +19,28 @@ If you are using [Umbraco Cloud](https://umbraco.com/products/umbraco-cloud/), y ## Two-factor authentication for Members -Since Umbraco does not control how the UI is for member login and profile edit. The UI for 2FA is shipped as part of the Partial View snippets. These can be used as a starting point, before styling the page as you would like. +The following guide will take you through implementing an option for your website members to enable two-factor authentication. + +{% hint style="info" %} +A setup for members needs to be implemented on your website in order for you to follow this guide. This setup should include: + +* Login and logout options. +* Public access restriction configured on at least 1 content item. -### Example implementation for Authenticator Apps for Members +[Learn more about setting up a members section in Umbraco.](../../tutorials/members-registration-and-login.md) +{% endhint %} -In the following example, we will use the [GoogleAuthenticator NuGet Package](https://www.nuget.org/packages/GoogleAuthenticator/). +As an example, the guide will use the [GoogleAuthenticator NuGet Package](https://www.nuget.org/packages/GoogleAuthenticator/). This package works for both Google and Microsoft authenticator apps. It can be used to generate the QR code needed to activate the app for the website. -Despite the name, this package works for both Google and Microsoft authenticator apps. It can be used to generate the QR code needed to activate the app for the website. +1. Install the GoogleAuthenticator Nuget Package on your project. +2. Create a new file in your project: `UmbracoAppAuthenticator.cs`. +3. Update the file with the following code snippet. {% code title="UmbracoAppAuthenticator.cs" lineNumbers="true" %} + ```csharp -using System; -using System.Threading.Tasks; using Google.Authenticator; +using System.Runtime.Serialization; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; @@ -35,17 +49,19 @@ namespace My.Website; /// /// Model with the required data to setup the authentication app. /// -public class QrCodeSetupData + +[DataContract] +public class QrCodeSetupData : ISetupTwoFactorModel { /// /// The secret unique code for the user and this ITwoFactorProvider. /// - public string Secret { get; init; } + public string? Secret { get; init; } /// /// The SetupCode from the GoogleAuthenticator code. /// - public SetupCode SetupCode { get; init; } + public SetupCode? SetupCode { get; init; } } /// @@ -82,14 +98,14 @@ public class UmbracoAppAuthenticator : ITwoFactorProvider /// The key of the user or member /// The secret that ensures only this user can connect to the authenticator app /// The required data to setup the authenticator app - public Task GetSetupDataAsync(Guid userOrMemberKey, string secret) + public Task GetSetupDataAsync(Guid userOrMemberKey, string secret) { var member = _memberService.GetByKey(userOrMemberKey); - var applicationName = "My application name"; + var applicationName = "testingOn15"; var twoFactorAuthenticator = new TwoFactorAuthenticator(); SetupCode setupInfo = twoFactorAuthenticator.GenerateSetupCode(applicationName, member.Username, secret, false); - return Task.FromResult(new QrCodeSetupData() + return Task.FromResult(new QrCodeSetupData() { SetupCode = setupInfo, Secret = secret @@ -112,13 +128,15 @@ public class UmbracoAppAuthenticator : ITwoFactorProvider public bool ValidateTwoFactorSetup(string secret, string token) => ValidateTwoFactorPIN(secret, token); } ``` -{% endcode %} -First, we create a model with the information required to set up the 2FA provider. Then we implement the `ITwoFactorProvider` with the use of the `TwoFactorAuthenticator` from the GoogleAuthenticator NuGet package. +{% endcode %} -Now we need to register the `UmbracoAppAuthenticator` implementation. This can be done on the `IUmbracoBuilder` in your startup or a composer. +4. Update `namespace` on line 7 to match your project. +5. Customize the `applicationName` variable on line 64. +6. Create a Composer and register the `UmbracoAppAuthenticator` implementation as shown below. {% code title="UmbracoAppAuthenticatorComposer.cs" lineNumbers="true" %} + ```csharp using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.DependencyInjection; @@ -135,15 +153,24 @@ public class UmbracoAppAuthenticatorComposer : IComposer } } ``` + {% endcode %} -At this point, the 2FA is active, but no members have set up 2FA yet. The setup of 2FA depends on the type. In the case of App Authenticator, we will add the following to our **view** showing the edit profile of the member. +At this point, the 2FA is active, but no members have set up 2FA yet. The setup of 2FA depends on the type. In the case of App Authenticator, add the following to the **view** showing the edit profile of the member. + +7. Add or choose a members-only page that should have the two-factor authentication setup. + * The page needs to be behind the public access. + * The page should **not** be using strongly types models. +8. Open the view file for the selected page. +9. Add the following code: + +{% code title="ExampleMemberPage.cshtml" lineNumbers="true" %} ```csharp -@using Umbraco.Cms.Core.Services -@using Umbraco.Cms.Web.Website.Controllers -@using Umbraco.Cms.Web.Website.Models -@using My.Website @* Or whatever your namespace with the QrCodeSetupData model is *@ +@using Umbraco.Cms.Core.Services; +@using Umbraco.Cms.Web.Website.Controllers; +@using Umbraco.Cms.Web.Website.Models; +@using My.Website; @inject MemberModelBuilderFactory memberModelBuilderFactory @inject ITwoFactorLoginService twoFactorLoginService @{ @@ -160,6 +187,9 @@ At this point, the 2FA is active, but no members have set up 2FA yet. The setup foreach (var providerName in providerNames) { var setupData = await twoFactorLoginService.GetSetupInfoAsync(profileModel.Key, providerName); + + // If the `setupData` is `null` for the specified `providerName` it means the provider is already set up. + // In this case, a button to disable the authentication is shown. if (setupData is null) { @using (Html.BeginUmbracoForm(nameof(UmbTwoFactorLoginController.Disable))) @@ -168,6 +198,7 @@ At this point, the 2FA is active, but no members have set up 2FA yet. The setup } } + // If `setupData` is not `null` the type is checked and the UI for how to set up the App Authenticator is shown. else if(setupData is QrCodeSetupData qrCodeSetupData) { @using (Html.BeginUmbracoForm(nameof(UmbTwoFactorLoginController.ValidateAndSaveSetup))) @@ -186,11 +217,24 @@ At this point, the 2FA is active, but no members have set up 2FA yet. The setup } ``` -In this razor-code sample, we get the current member's unique key and list all registered `ITwoFactorProvider` implementations. +{% endcode %} + +10. Update the `@using` in line 4 to match the namespace of your project. +11. [Optional] Customize the text fields and buttons to match your websites tone of voice (lines 33-39). + +![The QR Code is shown along with a field to enter a value to set up the two factor authentication.](images/2fa-members-configuration.png) + +### Test the set up for Members + +1. Login to the website using a test member. +2. Navigate to the page where the QR code was added. +3. Scan the QR code and add the verification code. +4. Logout of the website. +5. Login and verify that it asks for the two factor authentication. -If the `setupData` is `null` for the specified `providerName` it means the provider is already set up. In this case, we show a disable button. Otherwise, we check the type and show the UI for how to set up the App Authenticator. We will show the QR Code and an input field to validate the code from the App Authenticator. +You can also check that the **Two-factor Authentication** option is checked on the member in the Umbraco backoffice. -The last part required is to use the `Login` Partial View snippet. +![Check the Member profile in the Umbraco backoffice to verify whether two-factor authentication is enabeld.](images/2fa-member-backoffice.png) ### Notification when 2FA is requested for a member From be1471d0a714b2155dab2f0bfbbffe4225d622f9 Mon Sep 17 00:00:00 2001 From: sofietoft Date: Fri, 24 Jan 2025 12:45:32 +0100 Subject: [PATCH 3/7] Update steps for the user guide --- .../security/two-factor-authentication.md | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/15/umbraco-cms/reference/security/two-factor-authentication.md b/15/umbraco-cms/reference/security/two-factor-authentication.md index 6d97cb1ad9b..8c29884d88e 100644 --- a/15/umbraco-cms/reference/security/two-factor-authentication.md +++ b/15/umbraco-cms/reference/security/two-factor-authentication.md @@ -242,13 +242,20 @@ When a 2FA login is requested for a member, the `MemberTwoFactorRequestedNotific ## Two-factor authentication for Users -Umbraco controls how the UI is for user login and user edits, but will still need a view for configuring each 2FA provider. +The following guide will take you through implementing an option for backoffice users to enable two-factor authentication. + +This guide will not cover setting up the UI for user login and edits as this is handled elsewhere in the CMS. ### Example implementation for Authenticator Apps for Users -In the following example, we will use the [GoogleAuthenticator NuGet Package](https://www.nuget.org/packages/GoogleAuthenticator/). Despite the name, this package works for both Google and Microsoft authenticator apps. It can be used to generate the QR code needed to activate the app for the website. +As an example, the guide will use the [GoogleAuthenticator NuGet Package](https://www.nuget.org/packages/GoogleAuthenticator/). This package works for both Google and Microsoft authenticator apps. It can be used to generate the QR code needed to activate the app for the website. + +1. Install the GoogleAuthenticator Nuget Package on your project. +2. Create a new file in your project: `UmbracoUserAppAuthenticator.cs`. +3. Update the file with the following code snippet. + +{% code title="UmbracoUserAppAuthenticator.cs" lineNumbers="true" %} -{% code title="TwoFactorAuthInfo.cs" lineNumbers="true" %} ```csharp using System.Runtime.Serialization; using Google.Authenticator; @@ -308,8 +315,9 @@ public class UmbracoUserAppAuthenticator : ITwoFactorProvider ArgumentNullException.ThrowIfNull(user); + var applicationName = "My application name"; var twoFactorAuthenticator = new TwoFactorAuthenticator(); - SetupCode setupInfo = twoFactorAuthenticator.GenerateSetupCode("My application name", user.Username, secret, false); + SetupCode setupInfo = twoFactorAuthenticator.GenerateSetupCode(applicationName, user.Username, secret, false); return Task.FromResult(new TwoFactorAuthInfo() { QrCodeSetupImageUrl = setupInfo.QrCodeSetupImageUrl, @@ -333,20 +341,23 @@ public class UmbracoUserAppAuthenticator : ITwoFactorProvider public bool ValidateTwoFactorSetup(string secret, string token) => ValidateTwoFactorPIN(secret, token); } ``` + {% endcode %} -First, we create a model with the information required to set up the 2FA provider. Then we implement the `ITwoFactorProvider` with the use of the `TwoFactorAuthenticator` from the GoogleAuthenticator NuGet package. +4. Update `namespace` on line 7 to match your project. +5. Customize the `applicationName` variable on line 59. +6. Create a new file in your project: `UmbracoUserAppAuthenticatorComposer.cs`. +7. Implement a new composer and register the `UmbracoUserAppAuthenticator` implementation as shown below. -Now we need to register the `UmbracoUserAppAuthenticator` implementation and the view to show to set up this provider. This can be done on the `IUmbracoBuilder` in your startup or a composer. +{% code title="UmbracoUserAppAuthenticatorComposer.cs" lineNumbers="true" %} -{% code title="UmbracoAppAuthenticatorComposer.cs" lineNumbers="true" %} ```csharp using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.Security; namespace My.Website; -public class UmbracoAppAuthenticatorComposer : IComposer +public class UmbracoUserAppAuthenticatorComposer : IComposer { public void Compose(IUmbracoBuilder builder) { @@ -356,11 +367,18 @@ public class UmbracoAppAuthenticatorComposer : IComposer } } ``` + {% endcode %} -The last thing required is to register the provider in the Backoffice client so that the user can enable it. This can be done in a `umbraco-package.json` file. +8. Update the `namespace` on line 4 to match your project. + +With the 2FA in place, the provider needs to be registered in the backoffice client in order for the user to be able to use it. + +9. Add a new file to your project directory: `~/App_Plugins/TwoFactorProviders/umbraco-package.json`. +10. Add the following code to the new file: {% code title="~/App_Plugins/TwoFactorProviders/umbraco-package.json" lineNumbers="true" %} + ```json { "$schema": "../../umbraco-package-schema.json", @@ -379,27 +397,35 @@ The last thing required is to register the provider in the Backoffice client so ] } ``` + {% endcode %} At this point, the 2FA is active, but no users have set up 2FA yet. -* Each user can now enable the configured 2fa providers on their user. This can be done from the user panel by clicking the user avatar. +### Test the set up for Users + +Each user can now enable the configured 2FA providers on their user. + +1. Access the Umbraco backoffice. +2. Click the user avatar in the top-right corner. ![User panel](images/user-panel.jpg) -* When clicking the `Configure Two-Factor` button, a new panel is shown, listing all enabled two-factor providers. +3. Select `Configure Two-Factor` button to get a list of all enabled two-factor providers. ![Configure 2fa](images/configure-2fa.jpg) -* When clicking `Enable` on one of these, the configured view for the specific provider will be shown +4. Select `Enable` to show the configured view. ![Enable 2fa](images/enable-2fa.jpg) -* When the authenticator is enabled correctly, a disable button is shown instead. +5. Follow the instructions to configure 2FA. + +When the authenticator is enabled correctly, a disable button is shown instead. ![Disable 2fa](images/disable-2fa.jpg) -* To disable the two-factor authentication on your user, it is required to enter the verification code. Otherwise, admins are allowed to disable providers on other users. +To disable the two-factor authentication on your user, it is required to enter the verification code. ![Verify disable](images/verify-disable.jpg) From 7bd56e0398c931badbe7b0db87e5e396ca93cab1 Mon Sep 17 00:00:00 2001 From: sofietoft Date: Wed, 29 Jan 2025 08:39:27 +0100 Subject: [PATCH 4/7] Update two-factor-authentication.md --- 15/umbraco-cms/reference/security/two-factor-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15/umbraco-cms/reference/security/two-factor-authentication.md b/15/umbraco-cms/reference/security/two-factor-authentication.md index 8c29884d88e..5a21b859f88 100644 --- a/15/umbraco-cms/reference/security/two-factor-authentication.md +++ b/15/umbraco-cms/reference/security/two-factor-authentication.md @@ -156,7 +156,7 @@ public class UmbracoAppAuthenticatorComposer : IComposer {% endcode %} -At this point, the 2FA is active, but no members have set up 2FA yet. The setup of 2FA depends on the type. In the case of App Authenticator, add the following to the **view** showing the edit profile of the member. +At this point, the 2FA is active, but no members have set up 2FA yet. The setup of 2FA depends on the type. In the case of App Authenticator, the **view** showing the option to edit member profiles needs to be modified. 7. Add or choose a members-only page that should have the two-factor authentication setup. * The page needs to be behind the public access. From 946a25920a619356b4d90bcdb3c0db89b186ddc0 Mon Sep 17 00:00:00 2001 From: sofietoft Date: Wed, 29 Jan 2025 08:44:25 +0100 Subject: [PATCH 5/7] Update two-factor-authentication.md --- .../reference/security/two-factor-authentication.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/15/umbraco-cms/reference/security/two-factor-authentication.md b/15/umbraco-cms/reference/security/two-factor-authentication.md index 5a21b859f88..5577bddadbc 100644 --- a/15/umbraco-cms/reference/security/two-factor-authentication.md +++ b/15/umbraco-cms/reference/security/two-factor-authentication.md @@ -158,6 +158,10 @@ public class UmbracoAppAuthenticatorComposer : IComposer At this point, the 2FA is active, but no members have set up 2FA yet. The setup of 2FA depends on the type. In the case of App Authenticator, the **view** showing the option to edit member profiles needs to be modified. +{% hint style="info" %} +If you already have a members-only page with the edit profile options, you can skip directly to step 9. +{% endhint %} + 7. Add or choose a members-only page that should have the two-factor authentication setup. * The page needs to be behind the public access. * The page should **not** be using strongly types models. From e7a9864d0eb0bca8e17e99fa07651fcf069514a6 Mon Sep 17 00:00:00 2001 From: sofietoft Date: Wed, 29 Jan 2025 08:45:37 +0100 Subject: [PATCH 6/7] Update two-factor-authentication.md --- 15/umbraco-cms/reference/security/two-factor-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15/umbraco-cms/reference/security/two-factor-authentication.md b/15/umbraco-cms/reference/security/two-factor-authentication.md index 5577bddadbc..64a1fc2d84e 100644 --- a/15/umbraco-cms/reference/security/two-factor-authentication.md +++ b/15/umbraco-cms/reference/security/two-factor-authentication.md @@ -159,7 +159,7 @@ public class UmbracoAppAuthenticatorComposer : IComposer At this point, the 2FA is active, but no members have set up 2FA yet. The setup of 2FA depends on the type. In the case of App Authenticator, the **view** showing the option to edit member profiles needs to be modified. {% hint style="info" %} -If you already have a members-only page with the edit profile options, you can skip directly to step 9. +If you already have a members-only page with the edit profile options, you can skip directly to step 8. {% endhint %} 7. Add or choose a members-only page that should have the two-factor authentication setup. From bf58734151fe32c1a5a5b9c38037ec0d176d0a65 Mon Sep 17 00:00:00 2001 From: sofietoft Date: Wed, 29 Jan 2025 08:46:14 +0100 Subject: [PATCH 7/7] Update 15/umbraco-cms/reference/security/two-factor-authentication.md Co-authored-by: Esha Noronha <82437098+eshanrnh@users.noreply.github.com> --- 15/umbraco-cms/reference/security/two-factor-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15/umbraco-cms/reference/security/two-factor-authentication.md b/15/umbraco-cms/reference/security/two-factor-authentication.md index 64a1fc2d84e..821cc2a523e 100644 --- a/15/umbraco-cms/reference/security/two-factor-authentication.md +++ b/15/umbraco-cms/reference/security/two-factor-authentication.md @@ -376,7 +376,7 @@ public class UmbracoUserAppAuthenticatorComposer : IComposer 8. Update the `namespace` on line 4 to match your project. -With the 2FA in place, the provider needs to be registered in the backoffice client in order for the user to be able to use it. +With the 2FA in place, the provider needs to be registered in the backoffice client so the user can use it. 9. Add a new file to your project directory: `~/App_Plugins/TwoFactorProviders/umbraco-package.json`. 10. Add the following code to the new file: