Skip to content

Commit c698a2a

Browse files
authored
feat(templates): improve Boilerplate project template identity #10960 (#10961)
1 parent 6f87f49 commit c698a2a

File tree

12 files changed

+60
-21
lines changed

12 files changed

+60
-21
lines changed

src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Authorized/Management/RolesPage.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@
229229
Title="@Localizer[nameof(AppStrings.DeleteRole)]"
230230
Message="@Localizer.GetString(nameof(AppStrings.AreYouSureWannaDelete), selectedRoleItem?.Text ?? "")" />
231231

232-
<BitDialog OnOk="WrapHandled(RemoveRoleFromAllUsers)"
232+
<BitDialog OnOk="WrapHandled(RemoveAllUsersFromRole)"
233233
@bind-IsOpen="isRemoveRoleFromAllUsersDialogOpen"
234234
OkText="@Localizer[nameof(AppStrings.Yes)]"
235235
CancelText="@Localizer[nameof(AppStrings.No)]"

src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Authorized/Management/RolesPage.razor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,13 +382,13 @@ private void SearchUsers()
382382
}
383383
}
384384

385-
private async Task RemoveRoleFromAllUsers()
385+
private async Task RemoveAllUsersFromRole()
386386
{
387387
if (selectedRoleItem is null) return;
388388

389389
if (await AuthManager.TryEnterElevatedAccessMode(CurrentCancellationToken) is false) return;
390390

391-
await roleManagementController.RemoveRoleFromAllUsers(Guid.Parse(selectedRoleItem.Key!), CurrentCancellationToken);
391+
await roleManagementController.RemoveAllUsersFromRole(Guid.Parse(selectedRoleItem.Key!), CurrentCancellationToken);
392392

393393
selectedRoleUsers.Clear();
394394
}

src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -374,19 +374,26 @@ await identityController
374374

375375
private void CleanModel()
376376
{
377+
if (internalSignInPanelType is SignInPanelType.OtpOnly)
378+
{
379+
model.Password = null;
380+
validatorRef?.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.Password)));
381+
}
382+
else if (internalSignInPanelType is SignInPanelType.PasswordOnly && isOtpSent is false)
383+
{
384+
model.Otp = null;
385+
validatorRef?.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.Otp)));
386+
}
387+
377388
if (currentTab is SignInPanelTab.Email)
378389
{
379390
model.PhoneNumber = null;
380-
if (validatorRef is null) return;
381-
382-
validatorRef.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.PhoneNumber)));
391+
validatorRef?.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.PhoneNumber)));
383392
}
384393
else
385394
{
386395
model.Email = null;
387-
if (validatorRef is null) return;
388-
389-
validatorRef.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.Email)));
396+
validatorRef?.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.Email)));
390397
}
391398
}
392399

src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="9.0.5" />
2121
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.5" />
2222
<PackageVersion Include="EmbedIO" Version="3.5.2" />
23+
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" Version="9.0.5" />
2324
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="9.0.5" />
2425
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.5" />
2526
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="9.0.5" />

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Boilerplate.Server.Api.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<PackageReference Condition=" '$(appInsights)' == 'true' OR '$(appInsights)' == '' " Include="Microsoft.ApplicationInsights.AspNetCore" />
3030
<PackageReference Include="Humanizer" />
3131
<PackageReference Include="Microsoft.AspNetCore.Components.Web" />
32+
<PackageReference Include="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" />
3233
<PackageReference Include="NWebsec.AspNetCore.Middleware" />
3334
<PackageReference Include="QRCoder" />
3435
<PackageReference Include="Magick.NET-Q16-AnyCPU" />

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/Identity/RoleManagementController.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ public async Task<RoleDto> Update(RoleDto roleDto, CancellationToken cancellatio
7676
{
7777
var role = await GetRoleByIdAsync(roleDto.Id, cancellationToken);
7878

79+
if (AppRoles.IsBuiltInRole(role.Name!))
80+
throw new BadRequestException(Localizer[nameof(AppStrings.CanNotChangeBuiltInRole), role.Name!]);
81+
7982
if (role.ConcurrencyStamp != roleDto.ConcurrencyStamp)
8083
throw new ConflictException();
8184

@@ -95,6 +98,9 @@ public async Task Delete(Guid roleId, string concurrencyStamp, CancellationToken
9598
{
9699
var role = await GetRoleByIdAsync(roleId, cancellationToken);
97100

101+
if (AppRoles.IsBuiltInRole(role.Name!))
102+
throw new BadRequestException(Localizer[nameof(AppStrings.CanNotChangeBuiltInRole), role.Name!]);
103+
98104
if (role.ConcurrencyStamp != concurrencyStamp)
99105
throw new ConflictException();
100106

@@ -109,6 +115,9 @@ public async Task AddClaims(Guid roleId, List<ClaimDto> claims, CancellationToke
109115

110116
var role = await GetRoleByIdAsync(roleId, cancellationToken);
111117

118+
if (role.Name == AppRoles.SuperAdmin)
119+
throw new BadRequestException(Localizer[nameof(AppStrings.UserCantChangeSuperAdminRoleClaimsErrorMessage)]);
120+
112121
foreach (var claim in claims)
113122
{
114123
var result = await roleManager.AddClaimAsync(role, new(claim.ClaimType!, claim.ClaimValue!));
@@ -124,6 +133,9 @@ public async Task UpdateClaims(Guid roleId, List<ClaimDto> claims, CancellationT
124133
{
125134
var role = await GetRoleByIdAsync(roleId, cancellationToken);
126135

136+
if (role.Name == AppRoles.SuperAdmin)
137+
throw new BadRequestException(Localizer[nameof(AppStrings.UserCantChangeSuperAdminRoleClaimsErrorMessage)]);
138+
127139
foreach (var claim in claims)
128140
{
129141
var result = await roleManager.RemoveClaimAsync(role, new(claim.ClaimType!, claim.ClaimValue!));
@@ -144,6 +156,9 @@ public async Task DeleteClaims(Guid roleId, List<ClaimDto> claims, CancellationT
144156
{
145157
var role = await GetRoleByIdAsync(roleId, cancellationToken);
146158

159+
if (role.Name == AppRoles.SuperAdmin)
160+
throw new BadRequestException(Localizer[nameof(AppStrings.UserCantChangeSuperAdminRoleClaimsErrorMessage)]);
161+
147162
foreach (var claim in claims)
148163
{
149164
var result = await roleManager.RemoveClaimAsync(role, new(claim.ClaimType!, claim.ClaimValue!));
@@ -192,7 +207,7 @@ public async Task ToggleUserRole(UserRoleDto dto, CancellationToken cancellation
192207

193208
[HttpPost("{roleId}")]
194209
[Authorize(Policy = AuthPolicies.ELEVATED_ACCESS)]
195-
public async Task RemoveRoleFromAllUsers(Guid roleId, CancellationToken cancellationToken)
210+
public async Task RemoveAllUsersFromRole(Guid roleId, CancellationToken cancellationToken)
196211
{
197212
var role = await GetRoleByIdAsync(roleId, cancellationToken);
198213

@@ -230,9 +245,6 @@ private async Task<Role> GetRoleByIdAsync(Guid id, CancellationToken cancellatio
230245
var role = await roleManager.Roles.FirstOrDefaultAsync(r => r.Id == id, cancellationToken)
231246
?? throw new ResourceNotFoundException();
232247

233-
if (role.Name == AppRoles.SuperAdmin)
234-
throw new BadRequestException(Localizer[nameof(AppStrings.UserCantChangeSuperAdminRoleErrorMessage)]);
235-
236248
return role;
237249
}
238250
}

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Data/AppDbContext.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@
1717
//#endif
1818
using Hangfire.EntityFrameworkCore;
1919
using Boilerplate.Server.Api.Models.Attachments;
20+
using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore;
2021

2122
namespace Boilerplate.Server.Api.Data;
2223

2324
public partial class AppDbContext(DbContextOptions<AppDbContext> options)
24-
: IdentityDbContext<User, Role, Guid, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>(options)
25+
: IdentityDbContext<User, Role, Guid, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>(options), IDataProtectionKeyContext
2526
{
2627
public DbSet<UserSession> UserSessions { get; set; } = default!;
2728

@@ -44,6 +45,8 @@ public partial class AppDbContext(DbContextOptions<AppDbContext> options)
4445

4546
public DbSet<Attachment> Attachments { get; set; } = default!;
4647

48+
public DbSet<DataProtectionKey> DataProtectionKeys { get; set; } = default!;
49+
4750
protected override void OnModelCreating(ModelBuilder modelBuilder)
4851
{
4952
base.OnModelCreating(modelBuilder);

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using Microsoft.Net.Http.Headers;
1515
using Microsoft.IdentityModel.Tokens;
1616
using Microsoft.AspNetCore.Authentication;
17+
using Microsoft.AspNetCore.DataProtection;
1718
using Microsoft.AspNetCore.ResponseCompression;
1819
using Twilio;
1920
using Ganss.Xss;
@@ -275,6 +276,9 @@ void AddDbContext(DbContextOptionsBuilder options)
275276

276277
AddSwaggerGen(builder);
277278

279+
services.AddDataProtection()
280+
.PersistKeysToDbContext<AppDbContext>(); // It's advised to secure database-stored keys with a certificate by invoking ProtectKeysWithCertificate.
281+
278282
AddIdentity(builder);
279283

280284
var emailSettings = appSettings.Email ?? throw new InvalidOperationException("Email settings are required.");

src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Controllers/Identity/IRoleManagementController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public interface IRoleManagementController : IAppController
4040
Task ToggleUserRole(UserRoleDto dto, CancellationToken cancellationToken);
4141

4242
[HttpPost("{roleId}")]
43-
Task RemoveRoleFromAllUsers(Guid roleId, CancellationToken cancellationToken);
43+
Task RemoveAllUsersFromRole(Guid roleId, CancellationToken cancellationToken);
4444

4545
//#if (notification == true || signalR == true)
4646
[HttpPost]

src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Resources/AppStrings.fa.resx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,11 +1292,14 @@
12921292
<data name="UserCantRemoveItselfErrorMessage" xml:space="preserve">
12931293
<value>شما نمیتوانید کاربر خود را حذف کنید</value>
12941294
</data>
1295-
<data name="UserCantUnassignAllSuperAdminsErrorMessage" xml:space="preserve">
1295+
<data name="UserCantUnassignAllSuperAdminsErrorMessage" xml:space="preserve">
12961296
<value>شما نمیتوانید گروه کاربری SuperAdmin از این کاربر بگیرید</value>
12971297
</data>
1298-
<data name="UserCantChangeSuperAdminRoleErrorMessage" xml:space="preserve">
1299-
<value>شما نمیتوانید تغییری در گروه کاربری SuperAdmin ایجاد کنید</value>
1298+
<data name="UserCantChangeSuperAdminRoleClaimsErrorMessage" xml:space="preserve">
1299+
<value>دسترسی‌های گروه کاربری SuperAdmin قابل ویرایش نیست</value>
1300+
</data>
1301+
<data name="CanNotChangeBuiltInRole" xml:space="preserve">
1302+
<value>شما نمیتوانید تغییری در گروه کاربری {0} ایجاد کنید</value>
13001303
</data>
13011304
<data name="UserCantRemoveSuperAdminErrorMessage" xml:space="preserve">
13021305
<value>شما نمیتوانید این کاربر SuperAdmin را حذف کنید</value>

0 commit comments

Comments
 (0)