设置了默认的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被命中的情况。
在什么情况下用户不会为空?
答案 0 :(得分:0)
他们完全不同的事情。 "output_layers"
属性检查用户是否经过身份验证并有权访问该操作(基于角色权限等)。它不会对用户进行身份验证。这就是对Authorize
的呼吁。它实际上对用户进行身份验证,以便用户可以通过SignInManager
属性进行的检查。
至于用户何时可能为null,如果操作受Authorize
保护,则可能永远不会。它必须采取一些奇怪的事件,在数据库中找到用户才能签名,但是当你试图检索它时,它会以某种方式被删除。换句话说:可能不是血腥的。尽管如此,当一个值可能为null({1}}可能为空时)总是执行这样的空检查时,这是一个好习惯。