HI,
You can create a shared entityframeworkcore
project used to share the database
Hi,
Okay, thanks.
Hi,
This is the design of the Aspnet Core Identity, I would like to suggest that don't change it if you don't have to
However, you can change it:
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IdentityUserManager))]
public class MyUserManager : IdentityUserManager
{
public MyUserManager(
IdentityUserStore store,
IIdentityRoleRepository roleRepository,
IIdentityUserRepository userRepository,
IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<IdentityUser> passwordHasher,
IEnumerable<IUserValidator<IdentityUser>> userValidators,
IEnumerable<IPasswordValidator<IdentityUser>> passwordValidators,
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
IServiceProvider services,
ILogger<IdentityUserManager> logger,
ICancellationTokenProvider cancellationTokenProvider,
IOrganizationUnitRepository organizationUnitRepository,
ISettingProvider settingProvider) :
base(store,
roleRepository,
userRepository,
optionsAccessor,
passwordHasher,
userValidators,
passwordValidators,
keyNormalizer,
errors,
services,
logger,
cancellationTokenProvider,
organizationUnitRepository,
settingProvider)
{
}
public override async Task<IdentityResult> AccessFailedAsync(IdentityUser user)
{
ThrowIfDisposed();
var store = GetUserLockoutStore();
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
// If this puts the user over the threshold for lockout, lock them out and reset the access failed count
var count = await store.IncrementAccessFailedCountAsync(user, CancellationToken);
if (count < Options.Lockout.MaxFailedAccessAttempts)
{
return await UpdateUserAsync(user);
}
Logger.LogWarning(12, "User is locked out.");
await store.SetLockoutEndDateAsync(user, DateTime.Now.Add(Options.Lockout.DefaultLockoutTimeSpan),
CancellationToken);
await store.ResetAccessFailedCountAsync(user, CancellationToken);
return await UpdateUserAsync(user);
}
public override async Task<bool> IsLockedOutAsync(IdentityUser user)
{
ThrowIfDisposed();
var store = GetUserLockoutStore();
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
if (!await store.GetLockoutEnabledAsync(user, CancellationToken))
{
return false;
}
var lockoutTime = await store.GetLockoutEndDateAsync(user, CancellationToken);
return lockoutTime >= DateTime.Now;
}
private IUserLockoutStore<IdentityUser> GetUserLockoutStore()
{
var cast = Store as IUserLockoutStore<IdentityUser>;
return cast;
}
}
See: https://support.abp.io/QA/Questions/1628/AsyncBackgroundJobs#answer-9bd678d0-8939-94ff-3d01-39fdfeea6986
HI,
This is a temporary solution:
public class CancellationTokenOverride
{
public CancellationToken CancellationToken { get; }
public CancellationTokenOverride(CancellationToken cancellationToken)
{
CancellationToken = cancellationToken;
}
}
[Dependency(ReplaceServices = true)]
public class MyCancellationTokenProvider : ICancellationTokenProvider, ITransientDependency
{
public const string CancellationTokenOverrideContextKey = "Volo.Abp.Threading.CancellationToken.Override";
public CancellationToken Token { get
{
if (OverrideValue != null)
{
return OverrideValue.CancellationToken;
}
return _httpContextAccessor.HttpContext?.RequestAborted ?? CancellationToken.None;
}}
private readonly IAmbientScopeProvider<CancellationTokenOverride> _cancellationTokenOverrideScopeProvider;
private readonly IHttpContextAccessor _httpContextAccessor;
protected CancellationTokenOverride OverrideValue => _cancellationTokenOverrideScopeProvider.GetValue(CancellationTokenOverrideContextKey);
public MyCancellationTokenProvider(
IAmbientScopeProvider<CancellationTokenOverride> cancellationTokenOverrideScopeProvider,
IHttpContextAccessor httpContextAccessor)
{
_cancellationTokenOverrideScopeProvider = cancellationTokenOverrideScopeProvider;
_httpContextAccessor = httpContextAccessor;
}
public IDisposable Use(CancellationToken cancellationToken)
{
return _cancellationTokenOverrideScopeProvider.BeginScope(CancellationTokenOverrideContextKey, new CancellationTokenOverride(cancellationToken));
}
}
protected override async Task OnInitializedAsync()
{
cts.CancelAfter(2000);//To test CancellationToken
using (((MyCancellationTokenProvider) _cancellationTokenProvider).Use(cts.Token))
{
var pageResult = await CallsAppService.GetListAsync(new GetCallsInput { });
Calls = pageResult.Items;
}
}
Hi,
As I said, currently ABP does not support custom cancellationToken. because the request proxy interceptor always uses the ICancellationTokenProvider
.
This PR will solve the issue, but 5.0.0 version, for now, you can implement it locally.
Use CurrentTenant.Change
for per tenant : https://docs.abp.io/en/abp/latest/Multi-Tenancy#change-the-current-tenant
Resolved. You need to queue a job item: https://docs.abp.io/en/abp/latest/Background-Jobs#queue-a-job-item
Hi,
See: https://docs.abp.io/en/abp/latest/Timing
Configure<AbpClockOptions>(options =>
{
options.Kind = DateTimeKind.Local;
});