using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using xIdentityHelper; using xCommons.Attributes; using xCommons.Extensions; using xExceptions.Constants; using xIdentityModels.Constants; using xIdentityModels.Extensions; using xIdentityModels.Models; namespace xApi.Controllers { public partial class AccountController { // #region Registration ... /// /// Check a UserName is Available For Registration or not /// /// an string value which represent desired username /// a boolean value [AllowAnonymous] [RequireXPowered] [HttpGet ("CanRegisterUserName/{userName?}")] public async Task> CanRegisterUserName ( [FromRoute] string userName ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty (userName); // // Validate Type ... var type = userName.GetUserSelectByType (); if (type != XUserSelectBy.Username) { XException.InvalidArgs.Throw (); } // var result = await identityProvider .CanRegister (userName); // // Return Result return Ok (result); } catch (Exception ex) { // var result = GetExceptionActionResult (ex); // return result; } } /// /// Check a Mobile Number is Available For Registration or not /// /// an string value which represent desired mobile number /// a boolean value [AllowAnonymous] [RequireXPowered] [HttpGet ("CanRegisterMobileNumber/{mobileNumber?}")] public async Task> CanRegisterMobileNumber ( [FromRoute] string mobileNumber ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty (mobileNumber); // // Validate Type ... var type = mobileNumber.GetUserSelectByType (); if (type != XUserSelectBy.MobileNumber) { XException.InvalidArgs.Throw (); } // var result = await identityProvider .CanRegister (mobileNumber); // // Return Result return Ok (result); } catch (Exception ex) { // var result = GetExceptionActionResult (ex); // return result; } } /// /// Check a Email Address is Available For Registration or not /// /// an string value which represent desired email address /// a boolean value [AllowAnonymous] [RequireXPowered] [HttpGet ("CanRegisterEmail/{email?}")] public async Task> CanRegisterEmail ( [FromRoute] string email ) { // // Do Action ... try { // // Validate Args ... ValidationProvider.NotEmpty (email); // // Validate Type ... var type = email.GetUserSelectByType (); if (type != XUserSelectBy.Email) { XException.InvalidArgs.Throw (); } // var result = await identityProvider .CanRegister (email); // // Return Result return Ok (result); } catch (Exception ex) { // var result = GetExceptionActionResult (ex); // return result; } } /// /// Invite a User to Register on Dashboard /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - Email: which email address is going to invite. /// - Device: user's client device which is an instance of XDevice. /// - ReturnUrl: client application Registration URL. /// notice in this step you had to provide all this informations as FormData /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "email": "", /// "returnUrl": "", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// an instance of XActionResponse [RequireXPowered] [HttpPost ("InviteUser")] [Authorize (Policy = XPolicies.EnabledAdmin)] [Authorize (Policy = XPolicies.EnabledAgent)] public async Task> InviteUser ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } // await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.Email, model.ReturnUrl) .AddEmailAddress (model.Email) .AddNotNull (model.Device) .ValidateGroupAsync (); // // Get Request ... var tokens = await RetrieveTokensAsXTokenResponse (); var result = await identityProvider .InviteUser ( tokens, model ); // return Ok (result .ToDynamicObject ()); } catch (Exception ex) { // var result = GetExceptionActionResult (ex); return result; } } /// /// Recieve some Basic Informations and Start Registration Proccess /// if they Valid /// /// Registration Proccess Starts with Invoking this Action /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - FirstName: user's FirstName. /// - LastName: user's LastName. /// - DateOfBirth: user's dob date. /// - MobileNumber: user's MobileNumber optional. /// - Email: user's Email optional. /// - ActionToken: user's requested action token for this action (if user invited). /// - Device: user's client device which is an instance of XDevice. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "firstName": "", /// "lastName": "", /// "dateOfBirth": "", /// "email": "", /// "mobileNumber": "", /// "actionToken": "", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// an instance of XActionResponse [AllowAnonymous] [RequireXPowered] [HttpPost ("RequestRegistration")] public async Task> RequestRegistration ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.FirstName, model.LastName) .AddNotNull ( model.Device, model.DateOfBirth) .ValidateGroupAsync (); // // Get Request ... var result = await identityProvider .RequestRegistration ( model ); // return Ok (result .ToDynamicObject ()); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); // return exResult; } } /// /// Add User Account Informations /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - ActionToken: user's requested action token for this action. /// - UserName: user name. /// - Password: assigne password. /// - Device: user's client device which is an instance of XDevice. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "userName": "", /// "password": "", /// "actionToken": "", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// an instance of XActionResponse [AllowAnonymous] [RequireXPowered] [HttpPost ("AddAccountInfo")] public async Task> AddAccountInfo ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.ActionToken, model.UserName, model.Password) .AddNotNull (model.Device) .ValidateGroupAsync (); // // Get Request ... var result = await identityProvider .AddAccountInfo ( model ); // return Ok (result .ToDynamicObject ()); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } /// /// Upload and Attach a Profile Image for User. this is an Optional Step /// /// user's requested action token /// an instance of IFormFile for user's Avatar /// an instance of XActionResponse [AllowAnonymous] [RequireXPowered] [HttpPost ("AttachProfileImage")] public async Task> AttachProfileImage ( [FromForm] string actionToken, [FromForm] IFormFile file ) { // // Do Action ... try { // // Validate Args ... await ValidationProvider .GroupValidationBuilder () .AddNotEmpty (actionToken) .AddNotNull (file) .ValidateGroupAsync (); // var result = await identityProvider .AttachProfileImage ( actionToken, file ); // return Ok (result .ToDynamicObject ()); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } /// /// Finish Registrationn Proccess /// /// /// for this action you have to provide: /// - a proper User Identifier such as: (UserId, UserName, Email or MobileNumber). /// - Lang: client device currently used locale, such as: en-US. /// - ActionToken: user's requested action token for this action. /// - Password: assigne password. /// - Device: user's client device which is an instance of XDevice. /// - ReturnUrl: client application Login URL. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "userName": "", /// "password": "", /// "returnUrl": "", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// [AllowAnonymous] [RequireXPowered] [HttpPost ("FinishRegistration")] public async Task FinishRegistration ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.Password, model.ReturnUrl) .AddNotNull (model.Device) .AddUrl (model.ReturnUrl) .ValidateGroupAsync (); // var userSelectByParam = identityProvider .GetUserSelectByParam (model); ValidationProvider .NotEmpty (userSelectByParam); // // Get Request ... await identityProvider .FinishRegistration (model); // return Ok (); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); // return exResult; } } /// /// Check User is Confirmed Email or not /// /// a boolean value [RequireXPowered] [HttpGet ("IsConfirmedEmail")] [Authorize (Policy = XPolicies.User)] public async Task> IsConfirmedEmail () { // // Do Action ... try { // // Get Result ... var tokens = await RetrieveTokensAsXTokenResponse (); var result = await identityProvider .IsConfirmedEmail ( tokens, User.Identity.Name ); // // Return Result return Ok (result); } catch (Exception ex) { // var result = GetExceptionActionResult (ex); // return result; } } /// /// Check User is Confirmed Mobile or not /// /// a boolean value [RequireXPowered] [HttpGet ("IsConfirmedMobile")] [Authorize (Policy = XPolicies.User)] public async Task> IsConfirmedMobile () { // // Do Action ... try { // // Get Result ... var tokens = await RetrieveTokensAsXTokenResponse (); var result = await identityProvider .IsConfirmedMobile ( tokens, User.Identity.Name ); // // Return Result return Ok (result); } catch (Exception ex) { // var result = GetExceptionActionResult (ex); // return result; } } /// /// Request Registration Confirm /// /// /// for this action you have to provide: /// - a UserSelectedBy identifier which represet User. /// - Lang: client device currently used locale, such as: en-US. /// - Password: user's current active password. /// - Device: user's client device which is an instance of XDevice. /// - ReturnUrl: client application Confirm Registration URL. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "userId": "" /// "password": "", /// "returnUrl": "http://localhost/confirm", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// [AllowAnonymous] [RequireXPowered] [HttpPost ("RequestConfirmRegistration")] public async Task RequestConfirmRegistration ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.Password, model.ReturnUrl) .AddNotNull (model.Device) .AddUrl (model.ReturnUrl) .ValidateGroupAsync (); // // Get UserSelect By Param ... var userSelectByParam = model.GetUserSelectByParam (); ValidationProvider.NotEmpty (userSelectByParam); // await identityProvider .RequestConfirmRegistration (model); // return Ok (); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } /// /// Confirm Registration /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - ActionToken: user's requested action token for this action. /// - Device: user's client device which is an instance of XDevice. /// - ReturnUrl: client application Login URL. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "actionToken": "" /// "returnUrl": "http://localhost/login", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// [AllowAnonymous] [RequireXPowered] [HttpPost ("ConfirmRegistration")] public async Task ConfirmRegistration ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.ActionToken, model.ReturnUrl ) .AddNotNull (model.Device) .ValidateGroupAsync (); // // Get Request ... await identityProvider .ConfirmRegistration (model); // return Ok (); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } /// /// Request For Mobile Number Change/Confirm /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - Password: user's current active password. /// - MobileNumber: which phone number is going to confirm. /// - Device: user's client device which is an instance of XDevice. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "password": "", /// "mobileNumber": "", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// an instance of XActionResponse [AllowAnonymous] [RequireXPowered] [HttpPost ("RequestConfirmMobile")] public async Task> RequestConfirmMobile ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.Password, model.MobileNumber) .AddNotNull (model.Device) .AddMobileNumber (model.MobileNumber) .ValidateGroupAsync (); // // Get UserSelect By Param ... var userSelectByParam = GetUserSelectByParam ( model, excludes : new List { XUserSelectBy.Email, XUserSelectBy.MobileNumber }); // // Get Request ... var result = await identityProvider .RequestConfirmMobile (model); // return Ok (result .ToDynamicObject ()); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } /// /// Confirm Requested Mobile Number /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - ActionToken: user's requested action token for this action. /// - Device: user's client device which is an instance of XDevice. /// - MobileVerificationCode: a verification code which produced due Request Action. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "actionToken": "" /// "mobileVerificationCode": "", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// an instance of XActionResponse [AllowAnonymous] [RequireXPowered] [HttpPost ("ConfirmMobileNumber")] public async Task> ConfirmMobileNumber ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.MobileVerificationCode, model.ActionToken ) .AddNotNull (model.Device) .ValidateGroupAsync (); // // Get Request ... var result = await identityProvider .ConfirmMobileNumber (model); // return Ok (result .ToDynamicObject ()); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } /// /// Request For Email Address Change/Confirm /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - Password: user's current active password. /// - Email: which email address is going to confirm. /// - Device: user's client device which is an instance of XDevice. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "password": "", /// "email": "", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// an instance of XActionResponse [AllowAnonymous] [RequireXPowered] [HttpPost ("RequestConfirmEmail")] public async Task> RequestConfirmEmail ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.Email, model.Password) .AddNotNull (model.Device) .AddEmailAddress (model.Email) .ValidateGroupAsync (); // // Get UserSelect By Param ... var userSelectByParam = GetUserSelectByParam ( model, excludes : new List { XUserSelectBy.Email, XUserSelectBy.MobileNumber }); // // Get Request ... var result = await identityProvider .RequestConfirmEmail (model); // return Ok (result .ToDynamicObject ()); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } /// /// Confirm Requested Email Address /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - ActionToken: user's requested action token for this action. /// - Device: user's client device which is an instance of XDevice. /// - EmailVerificationCode: a verification code which produced due Request Action. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "actionToken": "" /// "emailVerificationCode": "", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// an instance of XActionResponse [AllowAnonymous] [RequireXPowered] [HttpPost ("ConfirmEmailAddress")] public async Task> ConfirmEmailAddress ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.EmailVerificationCode, model.ActionToken ) .AddNotNull (model.Device) .ValidateGroupAsync (); // // Get Request ... var result = await identityProvider .ConfirmEmailAddress (model); // return Ok (result .ToDynamicObject ()); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } /// /// Request Reset Password Action /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - Device: user's client device which is an instance of XDevice. /// - ReturnUrl: client application ResetPassword URL. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "returnUrl": "http://localhost/reset-password", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// an instance of XActionResponse [AllowAnonymous] [RequireXPowered] [HttpPost ("RequestResetPassword")] public async Task> RequestResetPassword ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.ReturnUrl) .AddNotNull (model.Device) .AddUrl (model.ReturnUrl) .ValidateGroupAsync (); // // Get UserSelect By Param ... var userSelectByParam = GetUserSelectByParam ( model, excludes : new List { XUserSelectBy.Email, XUserSelectBy.MobileNumber }); // // Get Request ... var result = await identityProvider .RequestResetPassword (model); // return Ok (result .ToDynamicObject ()); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } /// /// Reset a User's Password /// /// /// for this action you have to provide: /// - Lang: client device currently used locale, such as: en-US. /// - ActionToken: user's requested action token for this action. /// - NewPassword: user's new password to change. /// - Device: user's client device which is an instance of XDevice. /// - ReturnUrl: client application Login URL. /// /// Sample request: /// /// { /// "lang": "fa-IR", /// "actionToken": "", /// "newPassword": "", /// "returnUrl": "http://localhost/login", /// "device": { /// "os":"Mac", /// "browser":"Chrome", /// "osVersion":"mac-os-x-15", /// "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36", /// "deviceType":3, /// "identifier":"[Mac]-[mac-os-x-15]-[3]-[Chrome]-[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) x-framework-test/0.0.0 Chrome/87.0.4280.141 Electron/11.2.0 Safari/537.36]", /// "token":"96f400dd9aa5c57a8cec9d6f4775bad3" /// } /// } /// /// /// an instance of XActionRequest class which provider requirement for action /// [AllowAnonymous] [RequireXPowered] [HttpPost ("ResetPassword")] public async Task ResetPassword ( [FromBody] XActionRequest model ) { // // Do Action ... try { // // Validate Args ... if (!ModelState.IsValid) { XException.InvalidArgs.Throw (); } await ValidationProvider .GroupValidationBuilder () .AddNotEmpty ( model.Lang, model.ActionToken, model.NewPassword, model.ReturnUrl) .AddNotNull (model.Device) .ValidateGroupAsync (); // // Get Request ... await identityProvider .ResetPassword (model); // return Ok (); } catch (Exception ex) { // var exResult = GetExceptionActionResult (ex); return exResult; } } #endregion } }