Web.config<authentication mode="Forms">
          <forms loginUrl="index.aspx"/>
</authentication>登录按钮单击事件private void BTLogin_Click(object sender, System.EventArgs e)
{ ...... //用户名和密码验证
int nErrorType = CValidate.ValidateAdmin(TBAdminLoginName.Text.Trim(),TBAdminPassword.Text.Trim()); ...... //身份验证成功
UserInfo.AdminName = TBAdminLoginName.Text.Trim();

SetLoginCookie(UserInfo.AdminName,Convert.ToInt32(DDLCookieDays.SelectedValue)); // CUserCookie UserCookie = new CUserCookie(UserInfo); Response.Redirect("Admin.aspx");
}
设置Cookieprivate void SetLoginCookie(string userName, int cookieDays)
{
if (cookieDays == 0)
{
FormsAuthentication.SetAuthCookie(userName, false);
}
else
{
FormsAuthentication.SetAuthCookie(userName, true);
HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddDays(cookieDays);
}                           //获取初始请求路径Url
                   string redirectUrl = FormsAuthentication.GetRedirectUrl(userName,true).ToLower(); if (redirectUrl.IndexOf("index.aspx") == -1)
Context.Response.Redirect(redirectUrl);
else
Context.Response.Redirect("index.aspx");
}
创建Cookiepublic class CUserCookie
{ private HttpCookie UserCookie;
private string CookieName = "Apparel-CookieName";
private HttpContext Context = HttpContext.Current;
private CUserInfo User; public CUserCookie(CUserInfo user)
{
CookieName = CookieName + "-" + user.AdminName; UserCookie = Context.Request.Cookies[CookieName];
this.User = user; if (UserCookie == null)
{
UserCookie = new HttpCookie(CookieName);
}
else
{
UserCookie = Context.Request.Cookies[CookieName];
}
}
           }
假如不登录直接请求Admin.aspx页面在加载事件中如下写:private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(HttpContext.Current.Request.IsAuthenticated == false)
{
string redirectUrl = FormsAuthentication.GetRedirectUrl(adminName,persist).ToLower();
if (redirectUrl.IndexOf("index.aspx") == -1)
HttpContext.Current.Response.Redirect(redirectUrl);
}
}问题:          1:调用FormsAuthentication.SetAuthCookie()是应该自动创建身份验证票,并添加到Cookie的输出响应集合中,所以应该不用调用CUserCookie来创建;
          2:如何在各个页面Http请求中检查是否已通过身份验证,用户是否具有身份验证票,而在向上述直接请求Admin.aspx发生时程序判断无效;
          3:如何获取和登录用户名绑定的身份验证票,即已经存入Cookie输出响应集合中的状态,来判断当前用户没有身份验证票;
          4:调试程序中的 FormsAuthentication.FormsCookieName 不是正确设置的CookieName,而是本地机器上的根目录下的网站名称,不得其解;
          5:我想最主要的问题是对窗口身份验证的编程思路没有理顺,不知道如何设置,在哪儿设置。
          6:查看他人已经设置好的Cookie机制时,发现每个页面请求都没有身份检查,不知道Asp.Net是不是在Web.config中配置好了后,以后每个请求都会自动检查。、           本人初学.NET,思路不太清晰,手头资料有限,真的困扰多日了,还往各位大侠一解多日之愁,拜谢拜谢。

解决方案 »

  1.   

    http://search.csdn.net/lt/search.asp?key=forms+%C8%CF%D6%A4&pre=form+%D1%E9%D6%A4&option=nmlres&result=normal&page=1&size=10
      

  2.   

    Up
    谢谢web_gus
    问题正在研究中,也希望各位师兄继续指教
      

  3.   

    是不是采用FormsAuthentication.SetAuthCookie方法,必须设置FormsAuthentication.SetAuthCookie,问题是不是出在这里,但又如何关联和引用呢,希望大家帮我看看整个设置思路,指出来偏差和误区,谢谢。
      

  4.   

    <authentication mode="Forms"> 
    <forms name=".TACenter" loginUrl="login.aspx" protection="All" timeout="60" path="/"/>
        </authentication><authorization>
           <deny users="?"/>
     </authorization>即可设置本网站为所有页面必须登录才可访问,而登陆页面设置为上面的login.aspx
    另外详细设置cookie不是不行,但存储和提取都比较麻烦,如果不是特殊要求推荐以下方式:
    //通过验证
    .....
    //设置验票 参数1:用户名 参数2:是否保存登录状态
    System.Web.Security.FormsAuthentication.RedirectFromLoginPage(username,true);
    //完成
    就这么简单
      

  5.   

    Web.config:<httpModules>
    <add name="ApparelHttpModule" type="Apparel.Engine.ApparelHttpModule,Apparel"/>
    </httpModules>
    ApparelHttpModule:public class ApparelHttpModule : IHttpModule
    {
    public void Init(HttpApplication application)
    {
    application.AuthenticateRequest +=new EventHandler(application_AuthenticateRequest);
    } private void application_AuthenticateRequest(object sender, EventArgs e)
    {
    HttpContext Context = HttpContext.Current; CUserUtility.SetUserCookie();
    }
    }
    SetUserCookie:public static void SetUserCookie() 
    {
    HttpContext Context = HttpContext.Current; if (!Context.Request.IsAuthenticated) //?????
    return; string CookieName = "Apparel-CookieName" + "";  //????? if ((Context.Request.Cookies[CookieName] == null) || (Context.Request.Cookies[CookieName].Value == "")) 
    {
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
    1,                              // version
    Context.User.Identity.Name,     // user name
    DateTime.Now,                   // issue time
    DateTime.Now.AddHours(1),       // expires every hour
    false,                          // don't persist cookie
    null // roles
    ); //加密身份验证票
    String cookieStr = FormsAuthentication.Encrypt(ticket); //添加至输出响应
    Context.Response.Cookies[CookieName].Value = cookieStr;
    // Context.Response.Cookies[CookieName].Expires = DateTime.Now.AddMinutes(5);
    }
    else
    {
    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[CookieName].Value);
    }

    Context.User = new GenericPrincipal(Context.User.Identity,null);
    }
    问题:
    1:参照别人的程序加入了验证模块,每次页面重新启动时都需要运行验证,但是Context.Request.IsAuthenticated总是为true。
    2:不知如何绑定CookieName和登录用户名之间的关联,在模块中获取其登录用户名是无用的,必须是全局的用户标识值。
    3:程序中暂不采用角色授权,而只是想利用Cookie机制来验证非法页面请求是无效的,不知道采用窗口验证机制是否恰当。
    4:Context.User.Identity.Name获取的名称是计算机用户名,如何对应每一个登录用户设置写入身份验证票。
      

  6.   

    谢谢leisang,我会尝试的。
    是的,我也只是在学习……,但是想到这个份上不把它研究出来还真是心里不痛快……
    再次麻烦各位帮我看看啦。
      

  7.   

    看看我的博客,或許對你有所幫助 http://blog.csdn.net/cityhunter172/
    【原创】ASP.NET 安全认证(一)—— 如何运用 Form 表单认证
    【原创】ASP.NET 安全认证(二)——灵活运用 Form 表单认证中的 deny 与 allow 及保护 .htm 等文件