无法获取当前用户的guid

时间:2016-01-06 20:53:37

标签: c# asp.net-mvc authentication

this blogthis answer之后,我正在获取用户名(这似乎是正确的名称)。但是,当我按如下方式进行调用时,我得到 null

MembershipUser uno = Membership.GetUser(); //null
MembershipUser duo = Membership.GetUser(User.Identity.Name); // null
bool           tri = User.Identity.IsAuthenticated; // true
string         qua = User.Identity.AuthenticationType; // "ApplicationCookie"

用户肯定在数据库中,我在MVC.NET模板中使用了标准注册模块。由于其他地方的要求,我需要生成实际的guid,不能使用用户的名字。

这是我的Web.config的一部分,我怀疑它可能是相关的。我在安全问题上并不大。

<system.web>
  <authentication mode="None" />
  <compilation debug="true" targetFramework="4.5.2" />
  <customErrors mode="Off"></customErrors>
  <httpRuntime targetFramework="4.5.2" />
</system.web>
<system.webServer>
  <modules>
    <remove name="FormsAuthentication" />
  </modules>
</system.webServer>

1 个答案:

答案 0 :(得分:0)

首先,由于您使用了模板中的安全性,因此您不必使用Membership。您需要通过将其转换为ClaimsIdentity来获得正确的身份类型。然后,您可以访问该用户的所有声明。

有一种获取当前用户名称和指南的方法,你可以让intellisense指导你。但是,要考虑的安全问题还有很多,所以如果您有点好奇,请继续阅读。

有角色,用户ID,安全提供商等的声明。由于所有这些都收集在一个列表中,您需要过滤掉适合您的情况。作为帮助,您有字符串字段,例如RoleClaimTypeNameClaimType通常要求的声明。

var identity = User.Identity as ClaimsIdentity;
var roles = identity.Claims
  .Where(c => c.Type == identity.RoleClaimType)
  .Select(c => c.Value);

另外,请注意,在基本情况下(使用单一的声明身份),我们建议ClaimsPrincipal更多建议应用(它还具有Claims属性)。