首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我网站中的身份验证和安全性-需要建议

我网站中的身份验证和安全性-需要建议
EN

Stack Overflow用户
提问于 2010-05-27 18:13:41
回答 5查看 285关注 0票数 2

我使用一个用户名/密码列表和一个简单的web表单,允许用户输入他们的用户名/密码的数据库。

当他们提交页面时,我只需执行存储过程检查以进行身份验证。如果他们被授权,那么他们的用户详细信息(例如用户名、道布、地址、公司地址、其他重要信息)将存储在自定义用户对象中,然后存储在会话中。我创建的这个自定义用户对象将在整个web应用程序中使用,也可以用于子站点(会话共享)中。

我的问题是:

  1. 我的身份验证方法是正确的吗?
  2. 我发现用户抱怨他们的会话已经过期,尽管他们“没有空闲”,可能是因为应用程序池回收?他们键入大量文本,然后发现他们的会话已过期,因此丢失了所有键入的文本。我不确定会话是否真的偶尔重置,但是使用cookie /cookiless的Forms身份验证是否会解决issue?
  3. Alternatively问题呢?我应该在会话、cookie或其他东西中构建和存储用户对象,以便更“正确”,并避免像第2点那样的情况。
  4. 如果我沿着Forms身份验证路线走下去,我相信我不能将自定义用户对象存储在Forms身份验证cookie中,因此这是否意味着我将存储UserID,然后在每一页上重新创建User对象?这不会大大增加服务器负载吗?

非常感谢您的建议和回答。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-27 18:48:51

在使用这样一个简单的场景时,

  1. 它实际上并不关心你是使用自己的身份验证系统,还是默认的成员资格提供程序。
  2. 当应用程序可能一天回收几次时,你应该避免使用InProc会话状态。而是将会话存储到数据库(SqlSessionState)或使用StateServer。然后,应用程序池可以循环使用一整天,而不会干扰您的会话。将会话超时设置为60分钟左右,就可以解决剩余的问题。永远不要使用无session.
  3. Just会话(除非你知道你在做什么),,因为它们使得窃取一个人的profile存储到会话(或者配置文件,如果你使用默认的成员提供程序)太容易了。cookie不仅易于读取,而且还被限制为4 KB。
  4. 不,您将拥有一个存储所有用户信息的配置文件。无论是使用表单身份验证还是将数据存储到SqlSessionState中的自定义系统,这都无关紧要。成员资格提供程序会将配置文件ID存储到cookie中,就像会话状态会将会话ID保存到cookie中一样。
票数 1
EN

Stack Overflow用户

发布于 2010-05-27 18:39:24

您可以使用ASP.NET Membership, Roles, Forms Authentication, and Security Resources,我将给出一个使用c#的示例

参考Forms Authentication in ASP.NET 2.0

代码语言:javascript
复制
 //code for checking user name & password 
protected void btnlogin_Click(object sender, EventArgs e)
{
    try
    {
        if (txtUserName.Text.Trim() != "" && txtPassword.Text.Trim() != "")
        {
            User obj = objUser.UserAuthenticate(txtUserName.Text.Trim(), txtPassword.Text.Trim());
            if (obj != null)
            {
                //To set AuthenticationCookie of usertype "User"
                SetAuthenticationCookie("User", obj.UserID.ToString(), obj.DisplayName);

                HttpCookie usercookie = new HttpCookie("LoginTime");
                usercookie.Value = DateTime.Now.ToString();
                Response.Cookies.Add(usercookie);
                HttpCookie namecookie = new HttpCookie("LoginName");
                namecookie.Value = obj.DisplayName;
                Response.Cookies.Add(namecookie);



            }
            else
            {
                lblMsg.Text = "Invalid Username or Password.";
            }
        }
        else
        {
            //lblMsg.Visible = true;
        }
    }
    catch (Exception ex)
    {
        //lblMsg.Visible = true;
        throw ex;
    }
}

private void SetAuthenticationCookie(string role, string userid, string name)
{

string userdata = "logintype=user|role=" + role + "|email=" + txtUserName.Text.Trim() + "|name=" + name;

    FormsAuthenticationTicket faTicket = new FormsAuthenticationTicket(1, userid,
       DateTime.Now, DateTime.Now.AddHours(+1),
                                           false, userdata);

    HttpCookie authCookie = new HttpCookie( FormsAuthentication.FormsCookieName,//"martinfernandez@ispg.in",
                                            FormsAuthentication.Encrypt(faTicket));

    authCookie.Expires = faTicket.Expiration;
    Response.Cookies.Add(authCookie);


}

    //code inside global.asax.cs
    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (Context.User != null && Context.User.Identity is FormsIdentity && Context.User.Identity.IsAuthenticated)
        {
            FormsAuthenticationTicket faTicket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);

            string[] userdata = faTicket.UserData.Split("|".ToCharArray());
            string logintype = "";
            string email = "";
            string uname = "";
            string roleString = "";
            foreach (string s in userdata)
            {
                string keyname = s.Split("=".ToCharArray())[0];
                if (keyname == "logintype")
                {
                    logintype = s.Split("=".ToCharArray())[1];
                }
                else if (keyname == "role")
                {
                    roleString = s.Split("=".ToCharArray())[1];
                }
            }
            string[] rolesArray = roleString.Split(";".ToCharArray());
            Context.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(faTicket), rolesArray);
        }
    }   
票数 1
EN

Stack Overflow用户

发布于 2010-05-28 14:29:50

顺便说一下第四点--如果不在内存中存储每个人的"User“对象,并在每次HTTP请求时重新创建对象,在内存方面会更有效率。这样,您还可以重新验证登录详细信息--如果某人的帐户被攻破,并且实际用户更改了他们的密码以尝试保护他们的帐户,但“坏用户”已经登录了,该怎么办?在您的安全机制下,“坏用户”可以继续浏览,因为用户数据被缓存,并且不会在每次回发时重新验证。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2920175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档