当控制器具有[Authorize]属性时,此SignInManager调用的目的是什么?

时间:2017-07-27 13:37:42

标签: asp.net-mvc asp.net-identity

设置了默认的ASP.Net MVC 5应用程序后,我无法理解为什么下面的代码段会调用SignInManager。

这是在ManageController中,它具有[Authorize]属性。

    //
    // POST: /Manage/RemoveLogin
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> RemoveLogin(string loginProvider, string providerKey)
    {
        ManageMessageId? message;
        var result = await UserManager.Get().RemoveLoginAsync(User.Identity.GetUserId<int>(), new UserLoginInfo(loginProvider, providerKey));
        if (result.Succeeded)
        {
            var user = await UserManager.Get().FindByIdAsync(User.Identity.GetUserId<int>());
            if (user != null)
            {
                await SignInManager.Get().SignInAsync(user, isPersistent: false, rememberBrowser: false);
            }
            message = ManageMessageId.RemoveLoginSuccess;
        }
        else
        {
            message = ManageMessageId.Error;
        }
        return RedirectToAction("ManageLogins", new { Message = message });
    }

我想知道,当我检索经过身份验证的用户时,我应该重复此步骤,即检查用户是否为空,如果没有,则等待SignInAsync。 编辑:检查用户是否为空,如果,则等待SignInAsync

现在,我已经创建了一个新控制器,我已经给出了[Authorize]属性,并且在控制器的Index()函数中,我这样做:

        var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<int>());

如果我在两个标签中加载该页面,在其中一个标签中注销然后刷新页面,我就会被重定向到登录屏幕。我已经附加了一个调试器,并且无法导致SignInManager被命中的情况。

在什么情况下用户不会为空?

1 个答案:

答案 0 :(得分:0)

他们完全不同的事情。 "output_layers"属性检查用户是否经过身份验证并有权访问该操作(基于角色权限等)。它不会对用户进行身份验证。这就是对Authorize的呼吁。它实际上对用户进行身份验证,以便用户可以通过SignInManager属性进行的检查。

至于用户何时可能为null,如果操作受Authorize保护,则可能永远不会。它必须采取一些奇怪的事件,在数据库中找到用户才能签名,但是当你试图检索它时,它会以某种方式被删除。换句话说:可能不是血腥的。尽管如此,当一个值可能为null({1}}可能为空时)总是执行这样的空检查时,这是一个好习惯。