Skip to content

Commit b3ddaa0

Browse files
authored
Preparation Of First Release (Part 7/7) (#15)
* Add New User Domains * Fix Login Flow With UserStatus Check Support & Added IUserApplicationService * Fix Policies * Added User Status Change * Added Identifier Client * Added Authorizaton Client * Added Credentials Client
1 parent 8b0235d commit b3ddaa0

File tree

132 files changed

+3057
-1691
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

132 files changed

+3057
-1691
lines changed

samples/UAuthHub/CodeBeam.UltimateAuth.Sample.UAuthHub/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
{
9191
scope.ServiceProvider.GetRequiredService<IUserLifecycleStore>();
9292
scope.ServiceProvider.GetRequiredService<IUserProfileStore>();
93-
scope.ServiceProvider.GetRequiredService<IUserStore<UserKey>>();
93+
scope.ServiceProvider.GetRequiredService<IUserIdentifierStore>();
9494

9595
var seeder = scope.ServiceProvider.GetService<IAuthorizationSeeder>();
9696
//if (seeder is not null)

samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/Home.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
<UALoginForm @ref="_form" Identifier="@_username" Secret="@_password">
3232
<MudStack>
3333
<MudText Typo="Typo.h4">Welcome to UltimateAuth!</MudText>
34-
<MudTextField @bind-Value="@_username" Variant="Variant.Outlined" Label="Username" Immediate="true" HelperText="Default: Admin" />
35-
<MudPasswordField @bind-Value="@_password" Variant="Variant.Outlined" Label="Password" Immediate="true" HelperText="Default: Password!" />
34+
<MudTextField @bind-Value="@_username" Variant="Variant.Outlined" Label="Username" Immediate="true" HelperText="Default: admin or user" />
35+
<MudPasswordField @bind-Value="@_password" Variant="Variant.Outlined" Label="Password" Immediate="true" HelperText="Default: admin or user" />
3636
<MudButton Variant="Variant.Filled" Color="Color.Primary" ButtonType="ButtonType.Submit">Login</MudButton>
3737
</MudStack>
3838
</UALoginForm>

samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/Home.razor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@ private async Task HandleGetMe()
8686

8787
private async Task ChangeUserInactive()
8888
{
89-
ChangeUserStatusRequest request = new ChangeUserStatusRequest
89+
ChangeUserStatusAdminRequest request = new ChangeUserStatusAdminRequest
9090
{
9191
UserKey = UserKey.FromString("user"),
9292
NewStatus = UserStatus.Disabled
9393
};
94-
var result = await UAuth.Users.ChangeStatusAsync(request);
94+
var result = await UAuth.Users.ChangeStatusAdminAsync(request);
9595
if (result.Ok)
9696
{
9797
Snackbar.Add($"User is disabled.", Severity.Info);

samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Program.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
using CodeBeam.UltimateAuth.Authorization.InMemory.Extensions;
33
using CodeBeam.UltimateAuth.Authorization.Reference.Extensions;
44
using CodeBeam.UltimateAuth.Client.Extensions;
5+
using CodeBeam.UltimateAuth.Core.Abstractions;
56
using CodeBeam.UltimateAuth.Core.Domain;
67
using CodeBeam.UltimateAuth.Core.Extensions;
8+
using CodeBeam.UltimateAuth.Core.Infrastructure;
9+
using CodeBeam.UltimateAuth.Credentials;
710
using CodeBeam.UltimateAuth.Credentials.InMemory.Extensions;
811
using CodeBeam.UltimateAuth.Credentials.Reference;
912
using CodeBeam.UltimateAuth.Sample.BlazorServer.Components;
@@ -13,6 +16,7 @@
1316
using CodeBeam.UltimateAuth.Server.Extensions;
1417
using CodeBeam.UltimateAuth.Sessions.InMemory;
1518
using CodeBeam.UltimateAuth.Tokens.InMemory;
19+
using CodeBeam.UltimateAuth.Users.InMemory;
1620
using CodeBeam.UltimateAuth.Users.InMemory.Extensions;
1721
using CodeBeam.UltimateAuth.Users.Reference;
1822
using CodeBeam.UltimateAuth.Users.Reference.Extensions;
@@ -96,17 +100,6 @@
96100

97101
var app = builder.Build();
98102

99-
using (var scope = app.Services.CreateScope())
100-
{
101-
scope.ServiceProvider.GetRequiredService<IUserLifecycleStore>();
102-
//scope.ServiceProvider.GetRequiredService<IUserProfileStore>();
103-
//scope.ServiceProvider.GetRequiredService<IUserStore<UserKey>>();
104-
105-
var seeder = scope.ServiceProvider.GetService<IAuthorizationSeeder>();
106-
//if (seeder is not null)
107-
// await seeder.SeedAsync();
108-
}
109-
110103
// Configure the HTTP request pipeline.
111104
if (!app.Environment.IsDevelopment())
112105
{
@@ -118,6 +111,14 @@
118111
{
119112
app.MapOpenApi();
120113
app.MapScalarApiReference();
114+
using var scope = app.Services.CreateScope();
115+
//scope.ServiceProvider.GetRequiredService<IUserLifecycleStore>();
116+
//scope.ServiceProvider.GetRequiredService<IUserProfileStore>();
117+
//scope.ServiceProvider.GetRequiredService<IUserIdentifierStore>();
118+
//scope.ServiceProvider.GetRequiredService<ICredentialStore<UserKey>>();
119+
var seedRunner = scope.ServiceProvider.GetRequiredService<SeedRunner>();
120+
121+
await seedRunner.RunAsync(tenantId: null);
121122
}
122123

123124
app.UseHttpsRedirection();

src/CodeBeam.UltimateAuth.Client/CodeBeam.UltimateAuth.Client.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
</ItemGroup>
3030

3131
<ItemGroup>
32+
<ProjectReference Include="..\authorization\CodeBeam.UltimateAuth.Authorization.Contracts\CodeBeam.UltimateAuth.Authorization.Contracts.csproj" />
3233
<ProjectReference Include="..\CodeBeam.UltimateAuth.Core\CodeBeam.UltimateAuth.Core.csproj" />
3334
<ProjectReference Include="..\credentials\CodeBeam.UltimateAuth.Credentials.Contracts\CodeBeam.UltimateAuth.Credentials.Contracts.csproj" />
3435
<ProjectReference Include="..\users\CodeBeam.UltimateAuth.Users.Contracts\CodeBeam.UltimateAuth.Users.Contracts.csproj" />

src/CodeBeam.UltimateAuth.Client/Extensions/UltimateAuthClientServiceCollectionExtensions.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,12 @@ private static IServiceCollection AddUltimateAuthClientInternal(this IServiceCol
9797
o.Refresh.Interval ??= TimeSpan.FromMinutes(5);
9898
});
9999

100-
services.AddScoped<IUAuthRequestClient, UAuthRequestClient>();
101-
services.AddScoped<IUAuthClient, UAuthClient>();
102-
services.AddScoped<IFlowClient, DefaultFlowClient>();
100+
services.TryAddScoped<IUAuthRequestClient, UAuthRequestClient>();
101+
services.TryAddScoped<IUAuthClient, UAuthClient>();
102+
services.TryAddScoped<IFlowClient, DefaultFlowClient>();
103103
services.TryAddScoped<IUserClient, DefaultUserClient>();
104+
services.TryAddScoped<IUserIdentifierClient, DefaultUserIdentifierClient>();
105+
services.TryAddScoped<IAuthorizationClient, DefaultAuthorizationClient>();
104106

105107
services.AddScoped<ISessionCoordinator>(sp =>
106108
{
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using CodeBeam.UltimateAuth.Authorization.Contracts;
2+
using CodeBeam.UltimateAuth.Client.Infrastructure;
3+
using CodeBeam.UltimateAuth.Client.Options;
4+
using CodeBeam.UltimateAuth.Core.Contracts;
5+
using CodeBeam.UltimateAuth.Core.Domain;
6+
using Microsoft.Extensions.Options;
7+
8+
namespace CodeBeam.UltimateAuth.Client.Services
9+
{
10+
internal sealed class DefaultAuthorizationClient : IAuthorizationClient
11+
{
12+
private readonly IUAuthRequestClient _request;
13+
private readonly UAuthClientOptions _options;
14+
15+
public DefaultAuthorizationClient(IUAuthRequestClient request, IOptions<UAuthClientOptions> options)
16+
{
17+
_request = request;
18+
_options = options.Value;
19+
}
20+
21+
public async Task<UAuthResult<AuthorizationResult>> CheckAsync(AuthorizationCheckRequest request)
22+
{
23+
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, "/authorization/check");
24+
var raw = await _request.SendJsonAsync(url, request);
25+
return UAuthResultMapper.FromJson<AuthorizationResult>(raw);
26+
}
27+
28+
public async Task<UAuthResult<UserRolesResponse>> GetMyRolesAsync()
29+
{
30+
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, "/authorization/users/me/roles/get");
31+
var raw = await _request.SendFormForJsonAsync(url);
32+
return UAuthResultMapper.FromJson<UserRolesResponse>(raw);
33+
}
34+
35+
public async Task<UAuthResult<UserRolesResponse>> GetUserRolesAsync(UserKey userKey)
36+
{
37+
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, $"/admin/authorization/users/{userKey}/roles/get");
38+
var raw = await _request.SendFormForJsonAsync(url);
39+
return UAuthResultMapper.FromJson<UserRolesResponse>(raw);
40+
}
41+
42+
public async Task<UAuthResult> AssignRoleAsync(UserKey userKey, string role)
43+
{
44+
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, $"/admin/authorization/users/{userKey}/roles/post");
45+
var raw = await _request.SendJsonAsync(url, new AssignRoleRequest
46+
{
47+
Role = role
48+
});
49+
50+
return UAuthResultMapper.FromStatus(raw);
51+
}
52+
53+
public async Task<UAuthResult> RemoveRoleAsync(UserKey userKey, string role)
54+
{
55+
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, $"/admin/authorization/users/{userKey}/roles/delete");
56+
57+
var raw = await _request.SendJsonAsync(url, new AssignRoleRequest
58+
{
59+
Role = role
60+
});
61+
62+
return UAuthResultMapper.FromStatus(raw);
63+
}
64+
}
65+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
using CodeBeam.UltimateAuth.Client.Infrastructure;
2+
using CodeBeam.UltimateAuth.Client.Options;
3+
using CodeBeam.UltimateAuth.Core.Contracts;
4+
using CodeBeam.UltimateAuth.Core.Domain;
5+
using CodeBeam.UltimateAuth.Credentials.Contracts;
6+
using Microsoft.Extensions.Options;
7+
8+
namespace CodeBeam.UltimateAuth.Client.Services
9+
{
10+
internal sealed class DefaultUserCredentialClient : ICredentialClient
11+
{
12+
private readonly IUAuthRequestClient _request;
13+
private readonly UAuthClientOptions _options;
14+
15+
public DefaultUserCredentialClient(IUAuthRequestClient request, IOptions<UAuthClientOptions> options)
16+
{
17+
_request = request;
18+
_options = options.Value;
19+
}
20+
21+
private string Url(string path) => UAuthUrlBuilder.Combine(_options.Endpoints.Authority, path);
22+
23+
public async Task<UAuthResult<GetCredentialsResult>> GetMyAsync()
24+
{
25+
var raw = await _request.SendFormForJsonAsync(Url("/credentials/get"));
26+
return UAuthResultMapper.FromJson<GetCredentialsResult>(raw);
27+
}
28+
29+
public async Task<UAuthResult<AddCredentialResult>> AddMyAsync(AddCredentialRequest request)
30+
{
31+
var raw = await _request.SendJsonAsync(Url("/credentials/add"), request);
32+
return UAuthResultMapper.FromJson<AddCredentialResult>(raw);
33+
}
34+
35+
public async Task<UAuthResult<ChangeCredentialResult>> ChangeMyAsync(CredentialType type, ChangeCredentialRequest request)
36+
{
37+
var raw = await _request.SendJsonAsync(Url($"/credentials/{type}/change"), request);
38+
return UAuthResultMapper.FromJson<ChangeCredentialResult>(raw);
39+
}
40+
41+
public async Task<UAuthResult> RevokeMyAsync(CredentialType type, RevokeCredentialRequest request)
42+
{
43+
var raw = await _request.SendJsonAsync(Url($"/credentials/{type}/revoke"), request);
44+
return UAuthResultMapper.FromStatus(raw);
45+
}
46+
47+
public async Task<UAuthResult> BeginResetMyAsync(CredentialType type, BeginCredentialResetRequest request)
48+
{
49+
var raw = await _request.SendJsonAsync(Url($"/credentials/{type}/reset/begin"), request);
50+
return UAuthResultMapper.FromStatus(raw);
51+
}
52+
53+
public async Task<UAuthResult> CompleteResetMyAsync(CredentialType type, CompleteCredentialResetRequest request)
54+
{
55+
var raw = await _request.SendJsonAsync(Url($"/credentials/{type}/reset/complete"), request);
56+
return UAuthResultMapper.FromStatus(raw);
57+
}
58+
59+
60+
public async Task<UAuthResult<GetCredentialsResult>> GetUserAsync(UserKey userKey)
61+
{
62+
var raw = await _request.SendFormForJsonAsync(Url($"/admin/users/{userKey}/credentials/get"));
63+
return UAuthResultMapper.FromJson<GetCredentialsResult>(raw);
64+
}
65+
66+
public async Task<UAuthResult<AddCredentialResult>> AddUserAsync(UserKey userKey, AddCredentialRequest request)
67+
{
68+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/credentials/add"), request);
69+
return UAuthResultMapper.FromJson<AddCredentialResult>(raw);
70+
}
71+
72+
public async Task<UAuthResult> RevokeUserAsync(UserKey userKey, CredentialType type, RevokeCredentialRequest request)
73+
{
74+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/credentials/{type}/revoke"), request);
75+
return UAuthResultMapper.FromStatus(raw);
76+
}
77+
78+
public async Task<UAuthResult> ActivateUserAsync(UserKey userKey, CredentialType type)
79+
{
80+
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey}/credentials/{type}/activate"));
81+
return UAuthResultMapper.FromStatus(raw);
82+
}
83+
84+
public async Task<UAuthResult> BeginResetUserAsync(UserKey userKey, CredentialType type, BeginCredentialResetRequest request)
85+
{
86+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/credentials/{type}/reset/begin"), request);
87+
return UAuthResultMapper.FromStatus(raw);
88+
}
89+
90+
public async Task<UAuthResult> CompleteResetUserAsync(UserKey userKey, CredentialType type, CompleteCredentialResetRequest request)
91+
{
92+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/credentials/{type}/reset/complete"), request);
93+
return UAuthResultMapper.FromStatus(raw);
94+
}
95+
96+
public async Task<UAuthResult> DeleteUserAsync(UserKey userKey, CredentialType type)
97+
{
98+
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey}/credentials/{type}/delete"));
99+
return UAuthResultMapper.FromStatus(raw);
100+
}
101+
102+
}
103+
}

src/CodeBeam.UltimateAuth.Client/Services/DefaultUserClient.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ public DefaultUserClient(IUAuthRequestClient request, IOptions<UAuthClientOption
1818
_options = options.Value;
1919
}
2020

21-
public async Task<UAuthResult<UserProfileDto>> GetMeAsync()
21+
public async Task<UAuthResult<UserViewDto>> GetMeAsync()
2222
{
2323
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, "/users/me/get");
2424
var raw = await _request.SendFormForJsonAsync(url);
25-
return UAuthResultMapper.FromJson<UserProfileDto>(raw);
25+
return UAuthResultMapper.FromJson<UserViewDto>(raw);
2626
}
2727

2828
public async Task<UAuthResult> UpdateMeAsync(UpdateProfileRequest request)
@@ -39,9 +39,16 @@ public async Task<UAuthResult<UserCreateResult>> CreateAsync(CreateUserRequest r
3939
return UAuthResultMapper.FromJson<UserCreateResult>(raw);
4040
}
4141

42-
public async Task<UAuthResult<UserStatusChangeResult>> ChangeStatusAsync(ChangeUserStatusRequest request)
42+
public async Task<UAuthResult<UserStatusChangeResult>> ChangeStatusSelfAsync(ChangeUserStatusSelfRequest request)
4343
{
44-
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, "/users/status");
44+
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, $"/users/me/status");
45+
var raw = await _request.SendJsonAsync(url, request);
46+
return UAuthResultMapper.FromJson<UserStatusChangeResult>(raw);
47+
}
48+
49+
public async Task<UAuthResult<UserStatusChangeResult>> ChangeStatusAdminAsync(ChangeUserStatusAdminRequest request)
50+
{
51+
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, $"/admin/users/{request.UserKey.Value}/status");
4552
var raw = await _request.SendJsonAsync(url, request);
4653
return UAuthResultMapper.FromJson<UserStatusChangeResult>(raw);
4754
}
@@ -53,11 +60,11 @@ public async Task<UAuthResult<UserDeleteResult>> DeleteAsync(DeleteUserRequest r
5360
return UAuthResultMapper.FromJson<UserDeleteResult>(raw);
5461
}
5562

56-
public async Task<UAuthResult<UserProfileDto>> GetProfileAsync(UserKey userKey)
63+
public async Task<UAuthResult<UserViewDto>> GetProfileAsync(UserKey userKey)
5764
{
5865
var url = UAuthUrlBuilder.Combine(_options.Endpoints.Authority, $"/admin/users/{userKey}/profile/get");
5966
var raw = await _request.SendFormForJsonAsync(url);
60-
return UAuthResultMapper.FromJson<UserProfileDto>(raw);
67+
return UAuthResultMapper.FromJson<UserViewDto>(raw);
6168
}
6269

6370
public async Task<UAuthResult> UpdateProfileAsync(UserKey userKey, UpdateProfileRequest request)

0 commit comments

Comments
 (0)