Hi,
Yes, we have an HTTP API you can use to send the reset password code email.
You can also send it manually:
// inject IdentityUserManager and IAccountEmailer service.
protected IdentityUserManager UserManager { get; }
protected IAccountEmailer AccountEmailer { get; }
//Find a user
var resetToken = await UserManager.GeneratePasswordResetTokenAsync(user);
await AccountEmailer.SendPasswordResetLinkAsync(user, resetToken, input.AppName, input.ReturnUrl, input.ReturnUrlHash);
Hi,
Yes, you can. but I don't know what's blocking you, can you explain it in detail? thanks.
https://us05web.zoom.us/j/83932283381?pwd=Q0kvSXV2L3YvdTB1bDdBUkZhcWJ2Zz09
The authserver project.
The meeting has expired. I will check this problem and get back to you.
https://us05web.zoom.us/j/81240656843?pwd=NC85MkZlekF0ZUtYY2g2VEpFbG5IQT09
hide tenant switch
You can remove the CookieTenantResolveContributor
Configure<AbpTenantResolveOptions>(options =>
{
options.TenantResolvers.RemoveAll((x => x.Name == CookieTenantResolveContributor.ContributorName));
});
the system directoly knows which tenant
You can custom the LoginModel. for example:
[ExposeServices(typeof(LoginModel))]
public class MyLoginModel : OpenIddictSupportedLoginModel
{
private readonly ITenantRepository _tenantRepository;
public MyLoginModel(
IAuthenticationSchemeProvider schemeProvider,
IOptions<AbpAccountOptions> accountOptions,
IAbpRecaptchaValidatorFactory recaptchaValidatorFactory,
IAccountExternalProviderAppService accountExternalProviderAppService,
ICurrentPrincipalAccessor currentPrincipalAccessor,
IOptions<IdentityOptions> identityOptions,
IOptionsSnapshot<reCAPTCHAOptions> reCaptchaOptions,
AbpOpenIddictRequestHelper openIddictRequestHelper,
ITenantRepository tenantRepository) :
base(schemeProvider, accountOptions, recaptchaValidatorFactory, accountExternalProviderAppService, currentPrincipalAccessor, identityOptions, reCaptchaOptions, openIddictRequestHelper)
{
_tenantRepository = tenantRepository;
}
public async override Task<IActionResult> OnPostAsync(string action)
{
using (CurrentTenant.Change(await FindTenantByUser()))
{
return await base.OnPostAsync(action);
}
}
private async Task<Guid?> FindTenantByUser()
{
var tenants = await _tenantRepository.GetListAsync();
foreach (var tenant in tenants)
{
using(CurrentTenant.Change(tenant.Id))
{
///...Find User and return the TenantId
}
}
return null;
}
}
Hi,
You can check the Azure document: https://learn.microsoft.com/en-us/azure/devops/pipelines/ecosystems/dotnet-core?view=azure-devops&tabs=dotnetfive#publish-artifacts-to-azure-pipelines