hi
You can write detailed http request header info in the log.
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(AccountAppService), typeof(IAccountAppService))]
public class MyAccountAppService : AccountAppService
{
public MyAccountAppService(IdentityUserManager userManager,
IAccountEmailer accountEmailer,
IAccountPhoneService phoneService,
IIdentityRoleRepository roleRepository,
IdentitySecurityLogManager identitySecurityLogManager,
IBlobContainer<AccountProfilePictureContainer> accountProfilePictureContainer,
ISettingManager settingManager,
IOptions<IdentityOptions> identityOptions,
IIdentitySecurityLogRepository securityLogRepository) :
base(userManager, accountEmailer, phoneService, roleRepository, identitySecurityLogManager,
accountProfilePictureContainer, settingManager, identityOptions, securityLogRepository)
{
}
public async override Task ConfirmEmailAsync(ConfirmEmailInput input)
{
var httpContext = LazyServiceProvider.LazyGetRequiredService<IHttpContextAccessor>();
if (httpContext.HttpContext == null)
{
var obj = new
{
RemoteIpAddress = httpContext.HttpContext.Connection.RemoteIpAddress?.ToString(),
Headers = httpContext.HttpContext.Request.Headers
.Select(header => header.Key + " : " + header.Value)
.ToList()
};
var logger = LazyServiceProvider.LazyGetRequiredService<ILogger<MyAccountAppService>>();
logger.LogError(JsonSerializer.Serialize(obj));
}
await base.ConfirmEmailAsync(input);
}
}
Here is a temporary solution:
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(AccountAppService), typeof(IAccountAppService))]
public class MyAccountAppService : AccountAppService
{
public MyAccountAppService(IdentityUserManager userManager,
IAccountEmailer accountEmailer,
IAccountPhoneService phoneService,
IIdentityRoleRepository roleRepository,
IdentitySecurityLogManager identitySecurityLogManager,
IBlobContainer<AccountProfilePictureContainer> accountProfilePictureContainer,
ISettingManager settingManager,
IOptions<IdentityOptions> identityOptions,
IIdentitySecurityLogRepository securityLogRepository) :
base(userManager, accountEmailer, phoneService, roleRepository, identitySecurityLogManager,
accountProfilePictureContainer, settingManager, identityOptions, securityLogRepository)
{
}
public async override Task ConfirmEmailAsync(ConfirmEmailInput input)
{
var user = await UserManager.GetByIdAsync(input.UserId);
if (user.EmailConfirmed)
{
return;
}
await base.ConfirmEmailAsync(input);
}
}
hi
Yes, this URL can only be requested once.
Will it be requested by components like Azure or Firewall? You can write detailed http request header info in the log.
hi balessi75
When we click the confirmation link, however, we still receive the 'Invalid Token' error.
Is the email of the user confirmed?
Can you share the full logs of this test process ?
liming.ma@volosoft.com
hi
Does this answer can solve your problem?
https://support.abp.io/QA/Questions/4871/The-ABP-microservice-project-menu-permission-cannot-be-obtained#answer-3a0a8c28-f2e1-8a09-44f0-dc97396223e9
hi
You can put them on the Domain layer. : )
hi
We have a sample for Excel.
https://github.com/abpframework/abp-samples/pull/64
There is no sample for pdf.
hi
You can try to use MailKit.
https://docs.abp.io/en/abp/latest/Emailing https://docs.abp.io/en/abp/latest/MailKit
We also have a demo to test it.
https://github.com/abpframework/abp-samples/tree/master/EmailSendDemo
I would like to ask though; why that code for the CheckExpiresAt() not in the core ABP? Is there any other side effect?
We will do that. https://github.com/abpframework/abp/pull/16504
Also should I use the same code for the API HOST project?
No. This only needs for the web project.
Thanks. I will check it asap.
Do you have any steps to supplement?
why the user still ends up having their email flagged as confirmed even though they get the invalid token message?
This means that the URL has been accessed many times. The first time it succeeds, the token will be invalid after that.