2013-04-23 73 views
2

我想從我們已經通過servicestack的流暢驗證API鉤子鉤住了一個自定義驗證程序中訪問用戶的AuthSession的最佳途徑。基本上,這些要求迫使我們通過該驗證器使用名爲「DocNumberValidator」的類來訪問數據庫。用戶的Id在進行身份驗證時被保存到會話中,我們需要這些信息來完成成功的SQL查詢。如何訪問此會話信息(請參閱下面的....)。 IoC容器沒有引用AuthSession?隔離/訪問設置會話信息,servicestack API

  • 我想這個問題是,如何有人通過必要的會話值而進入由SS驗證框架調用的類?

示例代碼:


public class MyValidator : AbstractValidator<Statuses> 
{ 
    public IDocNumberValidator DocNumberValidator { get; set; } 

    public StatusesValidator() 
    { 
     RuleFor(s => s.DocNumber) 
       .Must(docNum => this.DocNumberValidator.Validate(docNum)) 
       .WithMessage("Document Number is invalid.") 
       .WithErrorCode("S-001"); 
    } 
} 

public class DocNumberValidator : IDocNumberValidator 
{ 
    public IDbConnectionFactory Db { get; set; } 

    public bool Validate(string docNum) 
    { 
     var isFound = false; 
     this.Db.Run(conn => 
      { 
       var sql = "SELECT COUNT([docNumber]) FROM [TABLE] WHERE [docNumber] = @DocNum AND [UserId] = @UserID"; 
       var cmd = conn.CreateCommand(); 
       cmd.CommandType = CommandType.Text; 
       cmd.CommandText = sql; 
       cmd.Parameters.Add(new SqlParameter("@DocNum", docNum)); 
       cmd.Parameters.Add(new SqlParameter("@UserID", ????????)); // how does one get access to saved users session here 
       int cnt = (int) cmd.ExecuteScalar(); 
       if (cnt == 1) 
        isFound = true; 

      }); 

     return isFound; 
    } 
} 

回答

1

不是真的知道這是做的最好的方式。接受建議。

  • 使用SessionFeature.GetSessionKey()來獲取會話密鑰
  • 添加public ICacheClient CacheClient { get; set; }來驗證。 將IoC容器注入
  • 使用該密鑰

添加到您的例子

public class DocNumberValidator : IDocNumberValidator 
{ 
    public IDbConnectionFactory Db { get; set; } 
    public ICacheClient CacheClient { get; set; } 

    public bool Validate(string docNum) 
    { 
     var isFound = false; 
     var sessionKey = SessionFeature.GetSessionKey(); 
     var user = CacheClient.Get<AuthUserSession>(sessionKey); //Use whatever class you stored in the session 

     this.Db.Run(conn => 
      { 
       var sql = "SELECT COUNT([docNumber]) FROM [TABLE] WHERE [docNumber] = @DocNum AND [UserId] = @UserID"; 
       var cmd = conn.CreateCommand(); 
       cmd.CommandType = CommandType.Text; 
       cmd.CommandText = sql; 
       cmd.Parameters.Add(new SqlParameter("@DocNum", docNum)); 
       cmd.Parameters.Add(new SqlParameter("@UserID", user.UserAuthId)); // user whatever property you need access to 
       int cnt = (int) cmd.ExecuteScalar(); 
       if (cnt == 1) 
        isFound = true; 

      }); 

     return isFound; 
    } 
} 
+0

有趣,我已經從 緩存獲取AuthUserSession(或任何你正在使用的類型)一直沿着同樣的道路...我會測試這個,並回來與你...感謝輸入paaschpa – darthal 2013-04-24 14:48:43

+0

工程...謝謝... – darthal 2013-04-24 19:18:11