【问题标题】:ASP.NET: Authenticating user in codeASP.NET:在代码中对用户进行身份验证
【发布时间】:2010-11-29 05:05:12
【问题描述】:

我正在使用身份验证和授权来为某些任务做准备。我创建了两个页面:Login.aspx 和 Default.aspx。在配置文件中,我将身份验证设置为表单并拒绝未经身份验证的用户访问:

<authentication mode="Forms">
      <forms name="aaa" defaultUrl="~/Login.aspx" />
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>

然后我编写了一些简单的代码来在 Login.aspx 中验证我的用户:

protected void Page_Load(object sender, EventArgs e)
        {
            GenericIdentity identity = new GenericIdentity("aga", "bbb");
            Context.User = new GenericPrincipal(identity, new String[] { "User" }); ;
            Response.Redirect("~/Default.aspx");
        }

当我运行它时,重定向不会发生。相反,Login.aspx 被一遍又一遍地调用,因为用户没有经过身份验证(每次加载时 Context.User.Identity.IsAuthenticated 为 false)。我做错了什么?

【问题讨论】:

    标签: asp.net authentication forms-authentication


    【解决方案1】:

    Context.User 仅设置当前请求的主体。一旦重定向发生,当前请求结束,新的请求再次以未覆盖的主体开始(显然未经过身份验证)。因此,设置 Context.User 实际上并没有验证任何内容。

    使用 FormsAuthentication.SetAuthCookie() 会将用户的 cookie 设置为 FormsAuthentication 提供程序接受的有效值,或者将令牌放入 URL。您可以重定向到您心中的内容,因为 cookie 显然会随着用户的未来请求而粘住。

    来自 MSDN(已添加):

    通过表单身份验证,您可以在想要对用户进行身份验证时使用 SetAuthCookie 方法但仍通过重定向保留对导航的控制权

    如上所述,这不一定需要 cookie - 这个名称有点误导,因为如果 FormsAuthentication 处于无 cookie 模式,它仍然可以通过 URL 工作:

    SetAuthCookie 方法将表单身份验证票添加到 cookie 集合,如果 CookiesSupported 为 false,则添加到 URL。

    【讨论】:

    • Server.Transfer 而不是 Response.Redirect 应该可以解决这个问题。
    • @Chris 仅适用于当前请求 - 只是将问题延迟到下一个请求。
    【解决方案2】:
    【解决方案3】:

    您需要将用户实际设置为已通过身份验证。以下所有方法都将起作用,让您真正摆脱登录屏幕。

    FormsAuthentication.Authenticate()
    FormsAuthentication.RedirectFromLoginPage()
    FormsAuthentication.SetAuthCookie()
    

    获得相同结果的方法很多。

    【讨论】:

      【解决方案4】:

      您实际上需要调用 formsAuthentication 提供程序来设置登录。

      FormsAuthentication.RedirectFromLoginPage(txtUser.Text, chkPersistLogin.Checked)

      是一个简单的例子

      【讨论】:

      • 如果我不希望用户被重定向?我只是想知道如何验证他
      【解决方案5】:

      创建虚拟 Context.User 后,需要执行 FormsAuthentication.SetAuthCookie 或 RedirectFromLoginPage 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 2015-03-24
        • 1970-01-01
        • 2021-06-11
        • 2013-11-14
        相关资源
        最近更新 更多