ASP.NET MVC5中程序化设置用户

5
我想在ASP.NET MVC5中编程登录用户。我是这样设置认证Cookie的:
FormsAuthentication.SetAuthCookie(username, true);

我原以为这已经足够了。但是当我想检查Request.IsAuthenticated的值时,它总是false。并且当我检查User.Identity.Name的值时,我得到的是一个空字符串,而不是之前传递的用户名。

我应该怎么做才能使其工作并正确地设置这些值?

编辑: 还有一件事。我没有使用任何登录表单,我是从另一个应用程序传递用户数据(登录和令牌)的。


1
您正在使用ASP.NET身份验证吗?如果是的话,它不使用FormsAuthentication。 - Erik Funkenbusch
@ErikFunkenbusch 为什么不呢? - meda
@meda - 因为它使用了不同的基于cookie的系统。 - Erik Funkenbusch
不,我不是。实际上我的方法是基于我以前用MVC3编写的项目。 - Paweł Reszka
1
@PawełReszka,你在webconfig中启用了表单身份验证吗? - meda
@meda 不,它不是。我已经启用了它,现在它可以工作啦;) 谢谢! - Paweł Reszka
2个回答

12

MVC5使用Identity而不是旧的SimpleMembership和ASP.NET Membership。Identity不使用表单认证,因此您所做的操作没有任何效果。

要通过Identity登录用户,首先需要一个实际的用户实例,可以通过执行类似以下内容的操作来获取:

var userManager = new UserManager<ApplicationUser>(context); 
var user = userManager.FindByName(username);

如果您有一个有效的用户 (user != null),您需要通过以下方式为该用户生成声明标识:

var identity = UserManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);

最后,您可以使用该身份验证信息来登录用户:
var authenticationManager = HttpContext.GetOwinContext().Authentication;
authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity);

如果您想要一个持久的登录状态,请将其更改为true


这不是我需要的,但还是谢谢你的帮助;) 这是我在MVC5中的第一个项目,我不知道最佳实践。 - Paweł Reszka
这正是我所需要的。如果您更改当前已登录用户的角色,则需要发送新的cookie。否则,User.IsInRole("RoleName") 将无法正常工作。 - mihkov
我已经尝试了一段时间来理解这部分内容。谢谢您将它简化到我可以理解如何使用的程度。 - Chad

2

请确保在您的 web.config 文件中启用了表单身份验证。

<system.web>
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
...
</system.web>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接