本人对于安全问题很重视,所以写程序的时候考虑安全问题比较多,这几天在研究后台登陆的问题,请教各位给我一套安全的方案,思路或是代码均可.方案主要是解决这些问题.1.session和cookies这两个登陆的时候的运用问题,两个都用吗?
2.从admin_login.aspx登陆成功后,转到admin_index.aspx页面,这个时候要在左上角显示登陆用户名和权限的,如:
用户名:kgdiwss
身份:系统CEO
我的一人思路是后台登陆的时候,就把登陆的用户名,IP等写到一个Loginlog表中,不知道大家如何处理.3.如果避免不登陆就直接进入admin_index.aspx,也就是如何实现没有登陆就转到admin_login.aspx,下面这段代码好像不够.
if (session["LoginUser"] == null)
{
Response.Redirect("admin_login.aspx");
}希望各位能把后台登陆开始的代码贴出来看看.本人下载了好多源码,都没有找到理想的答案.

解决方案 »

  1.   

    form验证,在Web.config里配置
    推荐一本书 ASP.NET安全性高级编程
      

  2.   

    用form验证吧, 。net里专门有个类来完成那些操作,把用户信息保存到一个验证票里, 再对验证票进行加密,再保存到cookie里面建议看微软的例子,duwamish或petshop
      

  3.   

    用form验证吧要动web.config的,然后没有更好的方法吗?我不太喜欢更改web.config里的东西。因为时间长了可能自已也不记的改了什么,到时候可能出现很多的问题。麻烦
      

  4.   

    web.config 里面可以实现很多功能啊,
      

  5.   

    --用form验证吧要动web.config的,然后没有更好的方法吗?
    这才是最好的办法啊
      

  6.   

    楼主,找到合适的解决方案了吗?
    如果找到了,给我一份
    近来我也在研究
    [email protected]
      

  7.   

    楼主,找到合适的解决方案了吗?
    如果找到了,给我一份
    近来我也在研究
    [email protected]
      

  8.   

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        
      <system.web>


        <!--  动态调试编译          设置 compilation debug="true" 以启用 ASPX 调试。否则,将此值设置为
              false 将提高此应用程序的运行时性能。 
              设置 compilation debug="true" 以将调试符号(.pdb 信息)          插入到编译页中。因为这将创建执行起来          较慢的大文件,所以应该只在调试时将该值设置为 true,而在所有其他时候都设置为          false。有关更多信息,请参考有关          调试 ASP.NET 文件的文档。    -->
        <compilation 
             defaultLanguage="c#"
             debug="false"
        />
        <!--  自定义错误信息          设置 customError 模式值可以控制应向          用户显示用户友好错误信息而不是错误详细信息(包括堆栈跟踪信息):          “On”始终显示自定义(友好的)信息  
              “Off”始终显示详细的 ASP.NET 错误信息。          “RemoteOnly”只对不在本地 Web 服务器上运行的          用户显示自定义(友好的)信息。出于安全目的,建议使用此设置,以便
              不向远程客户端显示应用程序的详细信息。    -->    
        <customErrors mode="RemoteOnly" defaultRedirect="Main/Login.aspx"/>     
        <!--  身份验证 
              此节设置应用程序的身份验证策略。可能的模式是“Windows”、“Forms”、          “Passport”和“None”    -->
        <authentication mode="Forms"> 
    <forms name=".Forms" loginUrl="Main/Login.aspx" protection="All" timeout="30" path="/">
    </forms>
    </authentication>

    <authorization>
         <deny users="?" />
        <allow users="*"/>
        </authorization>
        <!--  应用程序级别跟踪记录
              应用程序级别跟踪在应用程序内为每一页启用跟踪日志输出。          设置 trace enabled="true" 以启用应用程序跟踪记录。如果 pageOutput="true",则
              跟踪信息将显示在每一页的底部。否则,可以通过从 Web 应用程序
              根浏览 "trace.axd" 页来查看 
              应用程序跟踪日志。    -->
        <trace
            enabled="false"
            requestLimit="10"
            pageOutput="false"
            traceMode="SortByTime"
    localOnly="true"
        />    <!--  会话状态设置          默认情况下,ASP.NET 使用 cookie 标识哪些请求属于特定的会话。          如果 cookie 不可用,则可以通过将会话标识符添加到 URL 来跟踪会话。         若要禁用 cookie,请设置 sessionState cookieless="true"。    -->
        <sessionState 
                mode="InProc"
                stateConnectionString="tcpip=127.0.0.1:42424"
                sqlConnectionString="data source=127.0.0.1;user id=sa;password="
                cookieless="false" 
                timeout="30" 
        />
        <pages buffer="true" smartNavigation="false"/>    <!--  全球化          此节设置应用程序的全球化设置。    -->
         <globalization requestEncoding="GB2312" responseEncoding="GB2312"/>     
        
     </system.web>
     
      <location path="Default.aspx">
        <system.web>
          <authorization>
            <allow users="*"/>
          </authorization>
        </system.web>
     </location>      </configuration>
      

  9.   

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        
      <system.web>


        <!--  动态调试编译          设置 compilation debug="true" 以启用 ASPX 调试。否则,将此值设置为
              false 将提高此应用程序的运行时性能。 
              设置 compilation debug="true" 以将调试符号(.pdb 信息)          插入到编译页中。因为这将创建执行起来          较慢的大文件,所以应该只在调试时将该值设置为 true,而在所有其他时候都设置为          false。有关更多信息,请参考有关          调试 ASP.NET 文件的文档。    -->
        <compilation 
             defaultLanguage="c#"
             debug="false"
        />
        <!--  自定义错误信息          设置 customError 模式值可以控制应向          用户显示用户友好错误信息而不是错误详细信息(包括堆栈跟踪信息):          “On”始终显示自定义(友好的)信息  
              “Off”始终显示详细的 ASP.NET 错误信息。          “RemoteOnly”只对不在本地 Web 服务器上运行的          用户显示自定义(友好的)信息。出于安全目的,建议使用此设置,以便
              不向远程客户端显示应用程序的详细信息。    -->    
        <customErrors mode="RemoteOnly" defaultRedirect="Main/Login.aspx"/>     
        <!--  身份验证 
              此节设置应用程序的身份验证策略。可能的模式是“Windows”、“Forms”、          “Passport”和“None”    -->
        <authentication mode="Forms"> 
    <forms name=".Forms" loginUrl="Main/Login.aspx" protection="All" timeout="30" path="/">
    </forms>
    </authentication>

    <authorization>
         <deny users="?" />
        <allow users="*"/>
        </authorization>
        <!--  应用程序级别跟踪记录
              应用程序级别跟踪在应用程序内为每一页启用跟踪日志输出。          设置 trace enabled="true" 以启用应用程序跟踪记录。如果 pageOutput="true",则
              跟踪信息将显示在每一页的底部。否则,可以通过从 Web 应用程序
              根浏览 "trace.axd" 页来查看 
              应用程序跟踪日志。    -->
        <trace
            enabled="false"
            requestLimit="10"
            pageOutput="false"
            traceMode="SortByTime"
    localOnly="true"
        />    <!--  会话状态设置          默认情况下,ASP.NET 使用 cookie 标识哪些请求属于特定的会话。          如果 cookie 不可用,则可以通过将会话标识符添加到 URL 来跟踪会话。         若要禁用 cookie,请设置 sessionState cookieless="true"。    -->
        <sessionState 
                mode="InProc"
                stateConnectionString="tcpip=127.0.0.1:42424"
                sqlConnectionString="data source=127.0.0.1;user id=sa;password="
                cookieless="false" 
                timeout="30" 
        />
        <pages buffer="true" smartNavigation="false"/>    <!--  全球化          此节设置应用程序的全球化设置。    -->
         <globalization requestEncoding="GB2312" responseEncoding="GB2312"/>     
        
     </system.web>
     
      <location path="Default.aspx">
        <system.web>
          <authorization>
            <allow users="*"/>
          </authorization>
        </system.web>
     </location>      </configuration>
      

  10.   

    参阅MSDN上的身份验证,实战参考vs.net的示例Duwamish 7.0
      

  11.   

    看来各位说的,都是form验证,哈哈.只好用这个了.
      

  12.   

    private void btnlogin_Click(object sender, System.EventArgs e)
    {
    string strLoginID=username.Text.Trim();
    string strPassword=password.Text.Trim();
    LoginClass lgc=new LoginClass();
    string strReason;
    string strLoginflag=lgc.weblogin(strLoginID,strPassword);
    if(strLoginflag=="admin"||strLoginflag=="student")
    {
    Response.Cookies["empint"].Value=username.Text;
    Response.Cookies["empint"].Expires=DateTime.Now.AddDays(10);
    Session["LoginID"]=strLoginflag;
    Session["username"]=username.Text;
    if(strLoginflag=="admin")
    Response.Redirect("Main.aspx");
    else 
    Response.Redirect("Manager.aspx");
    //关闭登陆框
    Response.Write("<script language=javascrip>");
    Response.Write("windows.opener=null;");
    Response.Write("windows.close();");
    Response.Write("</script>");
    }
    else if(strLoginflag=="failure")
    {
    strReason="用户名和密码不匹配!";
    Response.Write("<script language=javascrip>");
    Response.Write("windows.alert(");
    Response.Write(strReason);
    Response.Write(")");
    Response.Write("</script>");
    }
    }
      

  13.   

    楼上的朋友你也用这个思路,哈哈.我也是这样想,不过你后台也用COOKIES啊,有这个必要吗?
      

  14.   

    关注中,最近我也在看登陆问题,只是感觉session比较好用
      

  15.   

    http://search.csdn.net/Expert/topic/2282/2282203.xml?temp=.1714289
      

  16.   

    基于Cookie的Form验证机制就能满足楼主的要求,不过涉及内容挺多的,建议楼主查阅相关资料,原来我做ASP的时候都用Session来完成这样的项目,页面多了特麻烦。感觉.net在登陆验证这方面比ASP要强大多了,在web.config里几行代码就实现了对某一目录的N个验证要求。
      

  17.   

    可是.net2.0默认是不加web.config文件的,不知道在.net2.0里面from验证是怎么做的。另外from验证,实际上也就是cookies验证。如果session很稳定的话,还是用session好。可惜,,,,,,session太不稳定了。
      

  18.   

    一般也就是这样了。还有证书、windows啊这些。
      

  19.   

    感谢各位支持,我查看了MSDN和搜索了一些资料,发现内容基本上相同,不过有些细节问题不太明白
    先在web.config中加入这段代码,这个不难理解:
    <authentication mode="Forms" >
    <forms name="MyAppFormAuth" loginUrl="login.aspx" protection="All" timeout="20" path="/">
    </forms>
    </authentication>    <authorization>
        <allow users="*" />
        </authorization>这里的forms name指的是不是各个页面的form的ID啊,每个页面的form的ID都必须相同是吗?
    接下来,如下代码:
    //进行表单身份验证(产生门票)
    FormsAuthenticationTicket tkt =new FormsAuthenticationTicket(1,user.UserName,DateTime.Now,DateTime.Now.AddDays(30),true,user.RoleName);
    string cookiestr = FormsAuthentication.Encrypt(tkt); 
    HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName,cookiestr); 
    Response.Cookies.Add(ck);//进入主界面
    Response.Redirect("WebMain/frmMain.aspx");这段代码中:
    new FormsAuthenticationTicket()这里面的参数有6个,它们的顺序是不是必须像上面这样?哪几个是固定不变的,哪几个是要用户自定义的,麻烦各位将以上代码一行行注释一下,我看后不是很明白原理,为什么这样写就可以做到验证啊,请帮帮忙.
      

  20.   

    admin_login.aspx登陆按钮我写了:
    Session["LoginUser"] = tbLoginPwd.Text;
    Session["IsLogin"] = true;在admin_left.aspx中,我用
    lbLoginUser.Text = Session["LoginUser"].ToString();
    显示用户身份,可是提示没有将对象应用到实例什么的.这是为什么?
      

  21.   

    我的IE是6.0的,打了SP2补丁.其实是这样的:
    我在admin_login.aspx登陆按钮登陆成功时写了:
    Session["LoginUser"] = tbLoginPwd.Text;
    Session["IsLogin"] = true;
    Response.Redirect("admin_index.aspx");admin_index.aspx其实是一个框架页,左边链接的是admin_left.aspx,用来显示添加文章等后台栏目,右边链接的是admin_right.aspx,用来显示使用说明等.现在就是要实现这样一个效果.在admin_left.aspx的顶部,显示出登录的用户名及其身份.在admin_left.aspx中,我在Page_Load事件中这样写:
    lbLoginUser.Text = Session["LoginUser"].ToString();
    可是提示没有将对象应用到实例什么的.于是我换成了:
    lbLoginUser.Text = (string)Session["LoginUser"];
    结果没有提示出错,不过lbLoginUser里没有显示任何东西。
    现在就是不知道问题出在哪里.郁闷中.
      

  22.   

    Session的问题已解决.不过forms验证这个还不是很明白.如果后台有好多种权限,用forms不是很不方便吗?