有没有办法在给定的时间跨度后从角色中删除用户?当我尝试类似下面的代码时,一旦延迟继续在sessionExpired()中,我得到一个空的异常......
public async Task<IActionResult> PurchaseSession(PurchaseSessionViewModel model)
{
var user = await _userManager.GetUserAsync(User);
await _userManager.AddToRoleAsync(user, "Active");
await _signInManager.RefreshSignInAsync(user);
// no await
sessionExpired(user);
return RedirectToAction(nameof(Index));
}
private async void sessionExpired(ApplicationUser user)
{
await Task.Delay(10000);
await _userManager.RemoveFromRoleAsync(user, "Active");
}
注意,我理解为什么会发生异常,但我希望保留这种基于角色的授权,因为[授权(角色=&#34;活跃&#34;)]提供了我的功能。之后。还有另一种方法吗?
答案 0 :(得分:0)
您的问题是您的user
变量是本地变量,因此在第一个函数结束后会被删除。
您可以使用闭包(作为lambda函数)。它是一个代码块,用于维护创建它的环境,因此即使某些变量被垃圾收集,您也可以稍后执行它。
编辑:如果你想知道为什么我之前的解决方案无法正常工作,可能是因为user
被身份一次或多次处理,所以这里是另一种尝试:
public async Task<IActionResult> PurchaseSession(PurchaseSessionViewModel model)
{
var user = await _userManager.GetUserAsync(User);
await _userManager.AddToRoleAsync(user, "Active");
await _signInManager.RefreshSignInAsync(user);
// We need to store an ID because 'user' may be disposed
var userId = user.Id;
// This create an environment where your local 'userId' variable still
// exists even after your 'PurchaseSession' method ends
Action sessionExpired = async () => {
await Task.Delay(10000);
var activeUser = _userManager.FindById(userId);
await _userManager.RemoveFromRoleAsync(activeUser, "Active");
};
Task.Run(sessionExpired);
return RedirectToAction(nameof(Index));
}