FormsAuthentication.SetAuthCookie是什么意思?

22

我正在使用一个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,但下一个请求它将看到用户。我认为这很愚蠢,并正在寻找一个简单的方法来解决它... - bambams
2个回答

19

您在CreateUserWizard上是否设置了LoginCreatedUser="false"或者DisableCreatedUser="true"

这些设置会防止用户立即登录,导致Membership.GetUser() 返回空值,因为该用户当前未登录。

如果您希望用户立即登录,请在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");
}

1

在创建用户后,您希望他们立即登录,对吧?如果是这样,您就会放置由 asp.net 使用的身份验证 cookie,以确定用户是否经过身份验证(与授权不同)。"false" 表示它不是持久的(相当于登录表单中的 "记住我?" 选项)。

至于为什么您的用户为空,我建议在调用 GetUser 前设置断点并查询您的用户数据存储区,看看它是否真的存在。


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