Asp.net核心角色到期

时间:2018-04-07 15:24:46

标签: c# asp.net asp.net-mvc asp.net-core

有没有办法在给定的时间跨度后从角色中删除用户?当我尝试类似下面的代码时,一旦延迟继续在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;)]提供了我的功能。之后。还有另一种方法吗?

1 个答案:

答案 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));
}