32

我需要在成功登录后直接获取 UserId Guid。以下代码不起作用:

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value))
{
    FormsAuthentication.SignOut();
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true);

    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        // doesn't run
        Guid puk = (Guid)Membership.GetUser().ProviderUserKey;            
    }
}

以下代码确实有效:

if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value))
{
    FormsAuthentication.SignOut();
    FormsAuthentication.SetAuthCookie(txtUsername.Value, true);

    MembershipUser user = Membership.GetUser(txtUsername.Value);

    if (user != null)
    {
        Guid puk = (Guid)user.ProviderUserKey;
    }
}

为什么会这样?除此之外还有什么事情要做SetAuthCookie吗?

4

4 回答 4

24

我也有同样的问题。我忘了设置 web.config 配置。

也许你也错过了。

   <system.web> 
    <authentication mode="Forms">
      <forms loginUrl="~/user/login" timeout="1000" name="__Auth" />
    </authentication>  
  </system.web> 
于 2015-01-04T18:06:43.313 回答
18

因为当您调用时,FormsAuthentication.SetAuthCookie(txtUsername.Value, true);您将密钥存储在客户端的 cookie 中。为此,您需要对用户做出响应。而HttpContext.Current.User.Identity要填充 cookie,您还需要一个请求。

简而言之,您的方案如下所示:

  1. 客户发送他的用户名和密码。

  2. 服务器获取并检查它。如果它们有效,则服务器将Set-Cookie标头发送给客户端。

  3. 客户端接收并存储它。对于每个请求,客户端将 cookie 发送回服务器。

@Jake 的更新

User添加设置示例HttpContext

var identity = new System.Security.Principal.GenericIdentity(user.UserName);
var principal = new GenericPrincipal(identity, new string[0]);
HttpContext.Current.User = principal;
Thread.CurrentPrincipal = principal;  

请注意,您可以创建自定义主体类,继承自GenericPrincipalClaimsPrincipal

于 2013-07-14T19:08:38.537 回答
4

在我的开发环境案例中,requireSSL 属性设置为 true,我通过将其更改为requireSSL = false.

在此处输入图像描述

于 2018-02-19T12:10:29.147 回答
3

我尝试了上述所有解决方案,但解决我问题的方法是在 web.config 中对此进行评论

 <modules>
  <remove name="FormsAuthentication"/>
 </modules>
于 2017-08-02T07:20:24.893 回答