身份验证-在WCF方法调用期间是否有保存状态的方法?

我已经实现了一个WCF服务,它使用WebServiceHost和WebHttpBinding。我在每个方法调用的开头通过这样的调用手动执行基本身份验证:

User u = GetAuthenticatedUser();

其中GetAuthenticatedUser正在使用WebOperationContext.Current.IncomingRequest.Headers[“Authorization”]header根据数据库中的条目对用户进行身份验证。我遇到的问题是我正在调用GetAuthenticatedUser在一个服务调用中多次,因为我的方法不在用户对象周围传递。WCF是否有表示每个服务调用“状态”的内容,可以在其中保存信息?

2个回答

  1. 使用OperationContext:

    public class UserContext : IExtension<OperationContext>
    
    {
    
        public User User { get; set; }
    
    
    
        public static User CurrentUser
    
        {
    
            set
    
            {
    
                UserContext context = OperationContext.Current.Extensions.Find<UserContext>();
    
                if (context == null)
    
                {
    
                    context = new UserContext();
    
                    OperationContext.Current.Extensions.Add(context);
    
                }
    
                context.User = value;
    
            }
    
            get
    
            {
    
                UserContext context = OperationContext.Current.Extensions.Find<UserContext>();
    
                if (context == null)
    
                {
    
                    return null;
    
                }
    
                return context.User;
    
            }
    
        }
    
    
    
        public void Attach(OperationContext owner) { }
    
        public void Detach(OperationContext owner) { }
    
    }
    
    

    的扩展示例Use:

    UserContext.CurrentUser = new User("foo");
    
    var user = UserContext.CurrentUser;
    
    

    related:在哪里存储当前WCF调用的数据?ThreadStatic安全吗?

  2. 简而言之,答案是否定的,没有办法用BasicHTTPBinding或webHTTPBinding保存会话状态(缺少将状态值写入数据库以供后续检索);这两种方法都像web服务器一样工作,不保存从请求到请求的任何内容。但我认为可以使用wsHttpBinding,它与webHttpBinding没有太大区别。看看这个链接,看看它是否对你有用。

Leave a Reply

Your email address will not be published. Required fields are marked *

You can use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>