.NET SDK β Client Reference: AccountClientΒΆ
Overview
This page documents the thin-wrapper methods exposed via Context.AccountClient and the user-related models used in responses.
- Methods:
- Current user:
GetCurrentUserAsync,LogoutAsync - Tokens and keys:
CreateTokenAsync,GetApiKeyAsync - User lookup:
GetByIdAsync,GetByUserNameAsync,FindAsync,GetUserCountAsync,GetAllAsync,GetPagedAsync - User lifecycle:
CreateAsync,UpdateAsync,DeleteAsync,ActivateUserAsync,ActivateAccountAsync,RegisterAsync - Group user create:
GroupCreateAsync - Account state:
UnblockUserAsync,BlockUserAsync - Password reset:
PasswordResetRequestAsync,PasswordResetAsync - Phone verification:
VerifyPhoneNoAsync - Two-factor authentication (2FA):
Get2FAProvidersAsync,Verify2FATokenAsync,Enable2FAAsync,Disable2FAAsync,GetAuthenticatorUrlAsync,GenerateAuthenticatorKeyAsync - Login providers:
GetUserLoginProvidersAsync,DeleteUserLoginProviderAsync
- Current user:
- Models:
UserViewModel(shape of user records)- Related types referenced in signatures (e.g.,
UserEditViewModel,UserActivateViewModel,UserPasswordResetViewModel,UserLoginInfo,GroupRoleUserViewModel)
Access pattern and response wrapper
- Access clients from the Context: for example
ctx.AccountClient. - All client methods return a response object with the payload in the
Resultproperty, unless otherwise stated. For example:PortalResponse<UserViewModel>orPortalResponse<ObservableCollection<UserViewModel>>.
Date-time is UTC
All date-time values in AIForged are stored and returned as UTC. Convert to local time in your application if required (for example, user.CreatedDate.ToLocalTime()).
PrerequisitesΒΆ
-
Install the SDK.
dotnet add package AIForged.SDK -
Initialize the SDK context (API key auth).
using AIForged.API; var baseUrl = Environment.GetEnvironmentVariable("AIFORGED_BASE_URL") ?? "https://portal.aiforged.com"; var apiKey = Environment.GetEnvironmentVariable("AIFORGED_API_KEY") ?? throw new Exception("AIFORGED_API_KEY not set."); var cfg = new Config { BaseUrl = baseUrl, Timeout = TimeSpan.FromMinutes(5) }; await cfg.Init(); cfg.HttpClient.DefaultRequestHeaders.Add("X-Api-Key", apiKey); var ctx = new Context(cfg); // Access the Account client from the context var account = ctx.AccountClient;
Verify connectivity
After initialization, call a lightweight endpoint such as await ctx.GetCurrentUserAsync() to confirm your API key and base URL are valid before making account calls.
MethodsΒΆ
Current userΒΆ
-
GetCurrentUserAsync(),GetCurrentUserAsync(CancellationToken)Returns the current authenticated userβs info.
var resp = await ctx.AccountClient.GetCurrentUserAsync(); var user = resp.Result; // UserViewModel Console.WriteLine($"{user.UserName} ({user.Email}) Created(UTC)={user.CreatedDate:u}"); -
LogoutAsync(),LogoutAsync(CancellationToken)Logs out the current user. Returns
PortalResponse<bool>.var resp = await ctx.AccountClient.LogoutAsync(); Console.WriteLine($"Logged out: {resp.Result}");
Response wrapper types
In narrative text, wrap generic types in backticks to avoid HTML parsing issues, for example: PortalResponse<UserViewModel> and PortalResponse<bool>.
Tokens and API keysΒΆ
-
CreateTokenAsync(string userId, string audience, string issuer),CreateTokenAsync(..., CancellationToken)Creates a special short-lived token. Returns
PortalResponse<string>.var tokenResp = await ctx.AccountClient.CreateTokenAsync(userId: "user-123", audience: "", issuer: ""); var jwt = tokenResp.Result; -
GetApiKeyAsync(string userId),GetApiKeyAsync(..., CancellationToken)Returns the API key for a user as
PortalResponse<string>.var keyResp = await ctx.AccountClient.GetApiKeyAsync("user-123"); var apiKeyForUser = keyResp.Result;
User lookupΒΆ
-
GetByIdAsync(string userid),GetByIdAsync(..., CancellationToken)var resp = await ctx.AccountClient.GetByIdAsync("user-123"); var user = resp.Result; -
GetByUserNameAsync(string userName),GetByUserNameAsync(..., CancellationToken)var resp = await ctx.AccountClient.GetByUserNameAsync("alice"); var user = resp.Result; -
FindAsync(string filter, int? groupId),FindAsync(..., CancellationToken)Search users. Returns
PortalResponse<ObservableCollection<UserViewModel>>.var resp = await ctx.AccountClient.FindAsync(filter: "alice", groupId: null); var users = resp.Result; // may be empty -
GetUserCountAsync(string filter, int? groupId),GetUserCountAsync(..., CancellationToken)var countResp = await ctx.AccountClient.GetUserCountAsync(filter: "team:", groupId: 42); var count = countResp.Result; -
GetAllAsync(int? groupId),GetAllAsync(..., CancellationToken)Returns
PortalResponse<ObservableCollection<UserViewModel>>.var resp = await ctx.AccountClient.GetAllAsync(groupId: null); var allUsers = resp.Result; -
GetPagedAsync(string filter, int? page, int? pageSize, int? groupId),GetPagedAsync(..., CancellationToken)var resp = await ctx.AccountClient.GetPagedAsync(filter: null, page: 1, pageSize: 50, groupId: null); var pageUsers = resp.Result;
Paging strategy
Pass explicit values to control result size.
User lifecycleΒΆ
-
CreateAsync(UserEditViewModel user),CreateAsync(..., CancellationToken)Creates a new user. Returns
PortalResponse<UserViewModel>.var newUser = new UserEditViewModel { UserName = "bob", Email = "bob@example.com" }; var resp = await ctx.AccountClient.CreateAsync(newUser); var created = resp.Result; -
UpdateAsync(UserEditViewModel user),UpdateAsync(..., CancellationToken)Updates another user. Returns
PortalResponse<bool>.var edit = new UserEditViewModel { UserName = "bob", Email = "bob@new.example.com" }; var ok = (await ctx.AccountClient.UpdateAsync(edit)).Result; -
DeleteAsync(string userId),DeleteAsync(..., CancellationToken)Deletes a user. Returns
PortalResponse<UserViewModel>.var resp = await ctx.AccountClient.DeleteAsync("user-123"); var deletedUser = resp.Result; -
RegisterAsync(UserEditViewModel user),RegisterAsync(..., CancellationToken)Registers a new user (self-registration). Returns
PortalResponse<UserViewModel>.var reg = new UserEditViewModel { UserName = "charlie", Email = "charlie@example.com" }; var resp = await ctx.AccountClient.RegisterAsync(reg); var registered = resp.Result; -
ActivateUserAsync(string userId),ActivateUserAsync(..., CancellationToken)Admin activates another user. Returns
PortalResponse<bool>.var ok = (await ctx.AccountClient.ActivateUserAsync("user-123")).Result; -
ActivateAccountAsync(UserActivateViewModel data),ActivateAccountAsync(..., CancellationToken)User activates their own account via token. Returns
PortalResponse<bool>.var ok = (await ctx.AccountClient.ActivateAccountAsync(new UserActivateViewModel { UserName = "charlie", Token = "..." })).Result;
Not-found behaviors
Returns 404 by the API, handle accordingly.
Group user createΒΆ
-
GroupCreateAsync(string userId, int? roleId, bool? grantTenantAdmin, UserEditViewModel user),GroupCreateAsync(..., CancellationToken)Creates a new user in a group with role options. Returns
PortalResponse<GroupRoleUserViewModel>.var resp = await ctx.AccountClient.GroupCreateAsync( userId: "group-owner-id", roleId: 10, grantTenantAdmin: false, user: new UserEditViewModel { UserName = "newuser", Email = "newuser@example.com" } ); var membership = resp.Result;
Account state (block/unblock)ΒΆ
UnblockUserAsync(string userId),UnblockUserAsync(..., CancellationToken)BlockUserAsync(string userId),BlockUserAsync(..., CancellationToken)
Both return PortalResponse<bool>.
var unblocked = (await ctx.AccountClient.UnblockUserAsync("user-123")).Result;
var blocked = (await ctx.AccountClient.BlockUserAsync("user-123")).Result;
Password resetΒΆ
-
PasswordResetRequestAsync(UserActivateViewModel data),PasswordResetRequestAsync(..., CancellationToken)Initiates a password reset request. Returns
PortalResponse<bool>. -
PasswordResetAsync(UserPasswordResetViewModel data),PasswordResetAsync(..., CancellationToken)Completes a password reset (by user). Returns
PortalResponse<bool>.
var requested = (await ctx.AccountClient.PasswordResetRequestAsync(new UserActivateViewModel { UserName = "alice", Token = "[ResetToken]" })).Result;
var resetOk = (await ctx.AccountClient.PasswordResetAsync(new UserPasswordResetViewModel { UserName = "alice", Token = "...", Password = "********", ConfirmPassword = "********" })).Result;
Email/token flows
Password and account activation tokens are sent via email upon requesting a password reset or creating a new account.
Phone verificationΒΆ
-
VerifyPhoneNoAsync(string userId, string phoneNo, string token),VerifyPhoneNoAsync(..., CancellationToken)Returns
PortalResponse<string>(verification result text).var result = (await ctx.AccountClient.VerifyPhoneNoAsync("user-123", "+1234567890", "123456")).Result;
Two-factor authentication (2FA)ΒΆ
-
Get2FAProvidersAsync(string userId),Get2FAProvidersAsync(..., CancellationToken)Returns
PortalResponse<ObservableCollection<string>>. -
Verify2FATokenAsync(string userId, string provider, string token),Verify2FATokenAsync(..., CancellationToken)Returns
PortalResponse<bool>. -
Enable2FAAsync(string userId, string provider),Enable2FAAsync(..., CancellationToken)Returns
PortalResponse<string>(e.g., status or secret info). -
Disable2FAAsync(string userId),Disable2FAAsync(..., CancellationToken)Returns
FileResponse. -
GetAuthenticatorUrlAsync(string userId),GetAuthenticatorUrlAsync(..., CancellationToken)Returns
PortalResponse<string>(authenticator URL). -
GenerateAuthenticatorKeyAsync(string userId),GenerateAuthenticatorKeyAsync(..., CancellationToken)Returns
PortalResponse<string>(secret/key).
var providers = (await ctx.AccountClient.Get2FAProvidersAsync("user-123")).Result;
var enableRes = (await ctx.AccountClient.Enable2FAAsync("user-123", "AuthenticatorApp")).Result;
var urlRes = (await ctx.AccountClient.GetAuthenticatorUrlAsync("user-123")).Result;
var secretRes = (await ctx.AccountClient.GenerateAuthenticatorKeyAsync("user-123")).Result;
var verified = (await ctx.AccountClient.Verify2FATokenAsync("user-123", "AuthenticatorApp", "123456")).Result;
// Disable returns FileResponse (not a PortalResponse)
using var file = await ctx.AccountClient.Disable2FAAsync("user-123");
Console.WriteLine($"Disable 2FA status: {file.StatusCode}");
Login providersΒΆ
-
GetUserLoginProvidersAsync(string userId),GetUserLoginProvidersAsync(..., CancellationToken)Returns
PortalResponse<ObservableCollection<UserLoginInfo>>. -
DeleteUserLoginProviderAsync(string userId, UserLoginInfo logininfo),DeleteUserLoginProviderAsync(..., CancellationToken)Returns
PortalResponse<UserLoginInfo>(the removed provider info).
var listResp = await ctx.AccountClient.GetUserLoginProvidersAsync("user-123");
var providers = listResp.Result;
if (providers?.Any() == true)
{
var removed = (await ctx.AccountClient.DeleteUserLoginProviderAsync("user-123", providers.First())).Result;
}
sequenceDiagram
participant "App" as "Your App"
participant "SDK" as "Context"
participant "API" as "AIForged API"
"App"->>"SDK": "ctx.AccountClient.GetCurrentUserAsync()"
"SDK"->>"API": "GetCurrentUserAsync"
"API"-->>"SDK": "PortalResponse"
"SDK"-->>"App": "Result (UserViewModel)"
"App"->>"SDK": "ctx.AccountClient.Enable2FAAsync(userId, provider)"
"SDK"->>"API": "Enable2FAAsync"
"API"-->>"SDK": "PortalResponse"
"SDK"-->>"App": "Result (string)"
Model: UserViewModelΒΆ
Represents a user record. Date-time values are UTC.
| Property | Type | Notes |
|---|---|---|
Id |
string |
|
UserName |
string |
Required; length 2β200. |
FullName |
string |
|
Email |
string |
Required (allow empty); max 200. |
JobTitle |
string |
|
PhoneNumber |
string |
|
Configuration |
string |
|
IsEnabled |
bool |
|
IsLockedOut |
bool |
|
FriendlyName |
string |
|
CreatedBy |
string |
|
UpdatedBy |
string |
|
CreatedDate |
DateTime |
UTC. |
UpdatedDate |
DateTime |
UTC. |
Roles |
ObservableCollection<string> |
|
ProjectCount |
int |
|
GroupCount |
int |
|
LinkedProjectCount |
int |
|
LinkedGroupCount |
int |
Print basic user info
var me = (await ctx.AccountClient.GetCurrentUserAsync()).Result;
Console.WriteLine($"{me.UserName} | {me.Email} | Created(UTC): {me.CreatedDate:u}");
Error handlingΒΆ
All methods may throw SwaggerException for server-side errors. Inspect StatusCode and Response for diagnostics; apply retries per your policy if appropriate.
try
{
var resp = await ctx.AccountClient.GetByUserNameAsync("alice");
var user = resp.Result;
}
catch (SwaggerException ex)
{
Console.Error.WriteLine($"API error {ex.StatusCode}");
Console.Error.WriteLine(ex.Response);
}
Cancellation
Prefer overloads that accept CancellationToken to bound calls in interactive workflows and services.
TroubleshootingΒΆ
- Empty results from search:
- Check
filtersyntax andgroupIdscope.
- Check
- 2FA verification issues:
- Ensure time synchronization on authenticator devices;
- API key/token concerns:
- Treat returned values as sensitive and store securely.