feat(auth): Unterstützung für Authenticator-App-Setup-Link hinzugefügt

- Es wurde ein neuer Abschnitt eingeführt, der einen Link für Benutzer anzeigt, um ihre Authenticator-App einzurichten, wenn viaAuthenticator aktiviert ist.
 - Abruf von envelopeKey aus ViewData hinzugefügt, um den Einrichtungslink zu erstellen.
 - Refactored codeKeyName Initialisierung für saubereren Code.
This commit is contained in:
Developer 02 2025-02-06 15:49:05 +01:00
parent 6b0ec9386c
commit 3e6e2078bb
3 changed files with 31 additions and 18 deletions

View File

@ -166,7 +166,7 @@
<value>Wir haben Ihnen gerade den Zugriffscode an die hinterlegte Email Adresse gesendet. Dies kann evtl. einige Minuten dauern.</value> <value>Wir haben Ihnen gerade den Zugriffscode an die hinterlegte Email Adresse gesendet. Dies kann evtl. einige Minuten dauern.</value>
</data> </data>
<data name="LockedBodyAuthenticator" xml:space="preserve"> <data name="LockedBodyAuthenticator" xml:space="preserve">
<value>Ihr QR-Code ist bis {0} gültig.</value> <value>Bitte geben Sie den in Ihrer Authenticator-App angegebenen TOTP-Code ein.</value>
</data> </data>
<data name="LockedBodyAuthenticatorNew" xml:space="preserve"> <data name="LockedBodyAuthenticatorNew" xml:space="preserve">
<value>Wir haben den QR-Code an Ihre E-Mail-Adresse gesendet. Ihr QR-Code ist bis {0} gültig. Sie können ihn für alle Umschläge verwenden, die Sie an diese E-Mail-Adresse erhalten.</value> <value>Wir haben den QR-Code an Ihre E-Mail-Adresse gesendet. Ihr QR-Code ist bis {0} gültig. Sie können ihn für alle Umschläge verwenden, die Sie an diese E-Mail-Adresse erhalten.</value>

View File

@ -166,7 +166,7 @@
<value>We have just sent you the access code to the email address you provided. This may take a few minutes.</value> <value>We have just sent you the access code to the email address you provided. This may take a few minutes.</value>
</data> </data>
<data name="LockedBodyAuthenticator" xml:space="preserve"> <data name="LockedBodyAuthenticator" xml:space="preserve">
<value>Your QR code is valid until {0}.</value> <value>Please enter the TOTP provided in your Authenticator app.</value>
</data> </data>
<data name="LockedBodyAuthenticatorNew" xml:space="preserve"> <data name="LockedBodyAuthenticatorNew" xml:space="preserve">
<value>We have sent the QR code to your e-mail address. Your QR code is valid until {0}. You can use it for all envelopes received at this email address.</value> <value>We have sent the QR code to your e-mail address. Your QR code is valid until {0}. You can use it for all envelopes received at this email address.</value>

View File

@ -7,8 +7,7 @@
ViewData["Title"] = _localizer[WebKey.DocProtected]; ViewData["Title"] = _localizer[WebKey.DocProtected];
var userCulture = ViewData["UserCulture"] as Culture; var userCulture = ViewData["UserCulture"] as Culture;
string codeType = ViewData["CodeType"] is string _codeType ? _codeType : "accessCode"; string codeType = ViewData["CodeType"] is string _codeType ? _codeType : "accessCode";
string codePropName = char.ToUpper(codeType[0]) + codeType.Substring(1); string codeKeyName = (char.ToUpper(codeType[0]) + codeType.Substring(1)).Replace("Code", "");
string codeKeyName = codePropName.Replace("Code", "");
bool viaSms = codeType == "smsCode"; bool viaSms = codeType == "smsCode";
bool viaAuthenticator = codeType == "authenticatorCode"; bool viaAuthenticator = codeType == "authenticatorCode";
bool viaTFA = viaSms || viaAuthenticator; bool viaTFA = viaSms || viaAuthenticator;
@ -16,6 +15,7 @@
DateTime? qrCodeExpiration = ViewData["QRCodeExpiration"] is DateTime _qrCodeExpiration ? _qrCodeExpiration : null; DateTime? qrCodeExpiration = ViewData["QRCodeExpiration"] is DateTime _qrCodeExpiration ? _qrCodeExpiration : null;
bool tfaEnabled = ViewData["TFAEnabled"] is bool _tfaEnabled && _tfaEnabled; bool tfaEnabled = ViewData["TFAEnabled"] is bool _tfaEnabled && _tfaEnabled;
bool hasPhoneNumber = ViewData["HasPhoneNumber"] is bool _hasPhoneNumber && _hasPhoneNumber; bool hasPhoneNumber = ViewData["HasPhoneNumber"] is bool _hasPhoneNumber && _hasPhoneNumber;
var envelopeKey = ViewData["EnvelopeKey"] as string;
} }
<div class="page container py-4 px-4"> <div class="page container py-4 px-4">
<header class="text-center"> <header class="text-center">
@ -31,12 +31,25 @@
</div> </div>
<h1>@_localizer[WebKey.Formats.LockedTitle.Format(codeKeyName)]</h1> <h1>@_localizer[WebKey.Formats.LockedTitle.Format(codeKeyName)]</h1>
</header> </header>
@if (viaAuthenticator)
{
<section class="text-center">
<p class="m-0 p-0">
Klicken Sie auf den
<a class="icon-link m-0 p-0" href="/tfa/@envelopeKey" style="text-decoration: none;" target="_blank">
Link
<i class="bi bi-box-arrow-up-right"></i>
</a>
um Ihre Authenticator-App einzurichten.
</p>
</section>
}
<section class="text-center"> <section class="text-center">
<p>@_localizer[WebKey.Formats.LockedBody.Format(codeKeyName)].Value.Format(qrCodeExpiration.ToString())</p> <p>@_localizer[WebKey.Formats.LockedBody.Format(codeKeyName)].Value.Format(qrCodeExpiration.ToString())</p>
</section> </section>
<div class="row m-0 p-0"> <div class="row m-0 p-0">
<div class="access-code-panel justify-content-center align-items-center p-0 m-0"> <div class="access-code-panel justify-content-center align-items-center p-0 m-0">
<form id="form-access-code" class="form form-floating mb-0" method="post"> <form id="form-access-code" class="form form-floating mb-0" method="post">
<div class="form-floating access-code-form-floating"> <div class="form-floating access-code-form-floating">
<input type="password" id="access_code" class="form-control" name="@codeType" placeholder="@_localizer[WebKey.Formats.LockedCodeLabel.Format(codeKeyName)]" required="required"> <input type="password" id="access_code" class="form-control" name="@codeType" placeholder="@_localizer[WebKey.Formats.LockedCodeLabel.Format(codeKeyName)]" required="required">
<label for="access_code">@_localizer[WebKey.Formats.LockedCodeLabel.Format(codeKeyName)]</label> <label for="access_code">@_localizer[WebKey.Formats.LockedCodeLabel.Format(codeKeyName)]</label>
@ -47,21 +60,21 @@
</button> </button>
@if (tfaEnabled) @if (tfaEnabled)
{ {
<div class="form-check form-switch tfa-sms"> <div class="form-check form-switch tfa-sms">
@if(hasPhoneNumber) @if(hasPhoneNumber)
{ {
<input asp-for="UserSelectSMS" class="form-check-input" name="userSelectSMS" type="checkbox" role="switch" id="flexSwitchCheckChecked"> <input asp-for="UserSelectSMS" class="form-check-input" name="userSelectSMS" type="checkbox" role="switch" id="flexSwitchCheckChecked">
} }
else else
{ {
<input asp-for="UserSelectSMS" class="form-check-input" name="userSelectSMS" type="checkbox" role="switch" id="flexSwitchCheckChecked" disabled> <input asp-for="UserSelectSMS" class="form-check-input" name="userSelectSMS" type="checkbox" role="switch" id="flexSwitchCheckChecked" disabled>
} }
<label class="form-check-label" for="flexSwitchCheckChecked">2FA per SMS</label> <label class="form-check-label" for="flexSwitchCheckChecked">2FA per SMS</label>
</div> </div>
} }
@if (smsExpiration is not null) @if (smsExpiration is not null)
{ {
<div id="sms-timer" class="alert alert-primary" role="alert">00:00</div> <div id="sms-timer" class="alert alert-primary" role="alert">00:00</div>
} }
</div> </div>
</form> </form>
@ -69,10 +82,10 @@
</div> </div>
@if (ViewData["ErrorMessage"] is string errMsg) @if (ViewData["ErrorMessage"] is string errMsg)
{ {
<div id="access-code-error-message" class="alert alert-danger row" role="alert"> <div id="access-code-error-message" class="alert alert-danger row" role="alert">
@_sanitizer.Sanitize(errMsg) @_sanitizer.Sanitize(errMsg)
</div> </div>
} }
<section class="no-receiver-explanation text-center"> <section class="no-receiver-explanation text-center">
<details> <details>