none
基本验证之后保存验证状态的问题 RRS feed

  • 问题

  • 大家好,我需要做一个用户登录的基本验证,验证类的主要部分如下:
    public class BasicAuthenticationModule : IHttpModule
    {
        protected void AuthenticateUser(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                HttpContext context = application.Context;
                string userName = null;
                string passWord = null;
                string domainName = null;
                string authorizationHeader = context.Request.Headers[HTTP_AUTHORIZATION_HEADER];
    
                //  Extract the basic authentication credentials from the request            
                if (!ExtractBasicCredential(authorizationHeader, ref userName, ref passWord, ref domainName))
                {
                    context.Response.StatusCode = 401;
                    return;
                }
    
                // Validate the user credentials 
                if (!ValidateCredential(userName, passWord, domainName))
                {
                    context.Response.StatusCode = 401;
                    return;
                }
                
                // Create the user principal and associate it with the request
                context.User = new GenericPrincipal(new GenericIdentity(userName), null);
            }
    
        public void Init(HttpApplication context)
            {
                // subscribe to the authenticate event to perform the authentication
                context.AuthenticateRequest += new EventHandler(this.AuthenticateUser);
    
                // subscribe to the EndRequest event to issue the challenge if unauthenticated
                context.EndRequest += new EventHandler(this.IssueAuthenticationChallenge);
            }
    }
    问题来了,不管用户是否已经通过验证,只要请求页面就会引发这个验证过程(只是已经通过验证的用户不会弹出登陆框),非常影响性能。请问是否有什么办法能够保存用户的验证状态?这样我就可以在验证函数的最前面先判断这个用户是否已经通过验证,如果已经通过就不用走后面的验证过程。

    我尝试过用context.User.Identity.IsAuthenticated来判断,但是即使我在通过验证后设置context.User.Identity.IsAuthenticated=true,当下次进入该函数时,context.User.Identity.IsAuthenticated的值还是会被初始化为false。

    诚心请教各位,谢谢。
    2009年8月19日 5:53

答案

  • 你好,如果验证成功,需要使用Cookie,Session等来保存一下状态。每次去验证之前读取一下Cookie,Session等状态信息是否存在,如果存在就不需要在验证了。
    jon.valett@gmail.com
    • 已建议为答案 skipsol 2009年8月19日 13:26
    • 已标记为答案 Chaos Yu 2009年8月20日 1:28
    2009年8月19日 6:41
    版主

全部回复

  • 没看见你写cookie啊 还有cookie的过期时间和from验证票
    你只写了判断 没有写存储逻辑

    2009年8月19日 6:23
  • 你好,如果验证成功,需要使用Cookie,Session等来保存一下状态。每次去验证之前读取一下Cookie,Session等状态信息是否存在,如果存在就不需要在验证了。
    jon.valett@gmail.com
    • 已建议为答案 skipsol 2009年8月19日 13:26
    • 已标记为答案 Chaos Yu 2009年8月20日 1:28
    2009年8月19日 6:41
    版主
  • 谢谢两位的提示,现在用Cookie保存状态就解决了。只是context.Session此时貌似为null,不知道是我用的不对还是?
    另外我还想问一下,代码中的HttpApplication对象为什么每次都会初始化呢,该对象是跟当前请求相关的吗,是不是每次发起请求都会重新实例化该对象?
    2009年8月19日 8:29
  • 每个请求都会实例化一个对象的
    2009年8月19日 9:04
  •  您好,因为http是面向非连接的协议。
    2009年8月19日 13:25
    版主
  • 谢谢两位的提示,现在用Cookie保存状态就解决了。只是context.Session此时貌似为null,不知道是我用的不对还是?
    另外我还想问一下,代码中的HttpApplication对象为什么每次都会初始化呢,该对象是跟当前请求相关的吗,是不是每次发起请求都会重新实例化该对象?

                HttpApplication httpApp = (HttpApplication)o;
    HttpContext ctx = HttpContext.Current;


    jon.valett@gmail.com
    2009年8月19日 15:32
    版主
  • HttpApplication 类的实例是在 ASP.NET 基础结构中创建的,而不是由用户直接创建的。 Web页初始化Page类,当应用程序运行时,页面从HttpApplication类初始化一个对象。这个对象包含方法、属性和事件,它们可供该应用程序中所有对象使用。ASP.NET在每个应用程序的生命周期过程中,维持一个HttpApplication实例池。每当页面收到来自服务器请求时,HttpApplication实例都会赋值给它。请求从开始到结束一直由该实例管理。一旦请求完成,实例即被释放以备重新使用。
    jon.valett@gmail.com
    2009年8月19日 15:36
    版主