【问题标题】:What does FormsAuthentication.SetAuthCookie doFormsAuthentication.SetAuthCookie 有什么作用
【发布时间】:2011-10-31 08:51:02
【问题描述】:

我正在使用一个 createuserwizard 控件。在 CreatedUser 事件中,我放置了此代码以将用户添加到角色。

    protected void RegisterUser_CreatedUser(object sender, EventArgs e)
    {
        FormsAuthentication.SetAuthCookie(RegisterUser.UserName, false /* createPersistentCookie */);


        if (!Roles.IsUserInRole("Test"))
        {
            var User= Membership.GetUser();
            Roles.AddUserToRole(User.UserName, "Test");
        }

        string continueUrl = RegisterUser.ContinueDestinationPageUrl;

        if (String.IsNullOrEmpty(continueUrl))
        {
            continueUrl = "~/";
        }
        Response.Redirect(continueUrl);
    }

我也想知道FormsAuthentication.SetAuthCookie(RegisterUser.UserName, false /* createPersistentCookie */); 是什么意思,它的用途是什么,为什么Membership.GetUser() 为空。

【问题讨论】:

  • 我认为默认的会员服务提供商不会在您每次检查登录用户时检查 cookie,而是在较早的请求处理阶段检查它。对于与您SetAuthCookie 相同的请求,它将返回null,但下一个请求它将看到用户。我认为这是迟钝的,正在寻找一种简单的方法来解决它......

标签: asp.net security asp.net-membership


【解决方案1】:

您的CreateUserWizard 上是否有LoginCreatedUser="false"DisableCreatedUser="true"

这些将阻止用户立即登录,并导致Membership.GetUser() 返回 null,因为用户当前未登录。

如果您希望用户立即登录,请在您的CreateUserWizard 上既不设置LoginCreatedUser="true" 也不设置DisableCreatedUser="false"。这应该可以让您当前的代码正常工作。

FormsAuthentication.SetAuthCookie() 设置浏览器 cookie 来启动用户会话。每次将页面发布到服务器时,它都会让用户保持登录状态。 createPersistentCookie 创建一个在浏览器关闭时不会过期的持久 cookie,因此用户可以返回站点并自动登录。它应该基于用户是否选中了登录表单上的“记住我”复选框。默认情况下,CreateUserWizard 表单上不提供它,但如果您愿意,可以在模板中为其添加一个复选框。

如果您不想让用户自动登录,请从您的代码中删除FormsAuthentication.SetAuthCookie() 行,并适当设置CreateUserWizard 属性。如果您想在用户登录之前批准用户,请设置DisableCreatedUser="true"。这将阻止他们登录,直到您从 IIS 管理器中的 .Net 用户模块设置用户 IsApproved=true,或者您拥有自定义网页来批准用户。

您仍然可以设置在创建用户时将用户添加到适当的角色,而无需登录:

if (!Roles.IsUserInRole(RegisterUser.UserName, "Test"))
{  
    Roles.AddUserToRole(RegisterUser.UserName, "Test");
}

【讨论】:

    【解决方案2】:

    创建用户后,您希望他们立即登录,对吗?如果是这种情况,则删除 asp.net 使用的身份验证 cookie 以确定用户是否经过身份验证(与授权不同)。 “false”表示它不持久(相当于登录表单上的“记住我吗?”选项。

    至于为什么您的用户为 NULL,我建议在 GetUser 调用之前放置一个断点并查询您的用户数据存储以查看它是否真的存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2014-06-11
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多