2012-04-25 67 views
2

我正在为我的WCF安全性使用自定义用户名和密码验证。现在我想在请求期间存储用户名,以便稍后可以在被调用的方法中访问它。我怎么做?将数据存储在WCF请求中的位置

一些示例代码来描述我的问题:

public class CustomUserValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string username, string password) 
    { 
     if (username == "aaa" && password == "bbb") 
     { 
      // store username where i can get it in method called later. 
      return; 
     } 
     throw new SecurityTokenException("Unknown Username or Password"); 
    } 
} 

现在的方法被称为:

public void WebServiceMethod() 
{ 
    Database.User.Single(c => c.Username == /* username from above */); 
} 

BR
安德烈亚斯

+0

最简单的方法是将它存储在一个静态的用户名属性。更好的方法是编写一个自定义的WCF行为。 – daryal 2012-04-25 11:55:57

+3

@daryal在每个级别上都不好; a:WCF是多线程的,b:WCF可以在不同的点使用不同的线程(使得线程静态不可靠) – 2012-04-25 11:59:20

+0

@MarcGravell你在每个关卡都是对的:),但为了回答这个问题,实例模式和concurreny模式。这就是为什么我建议写一个行为。 – daryal 2012-04-25 12:02:38

回答

3

您通常会通过发出这样做自定义“主体”,通过IAuthorizationPolicy完成; IIRC,用户名将通过评估上下文参数提供给auth-policy。 A 一般漫游到WCF中的自定义主体是here,但是您可能需要在Evaluate中试验一下,以在评估上下文中找到传入的用户名。特别是,如果任何密钥是“索赔”字典,请看看。并在评估上下文中查看.Claims - 您应该在其发布的CustomUserValidator中找到一个“索赔”,其中包含用户名。

然而,我已经完成了完全是你在之前的工作中描述过 - 而且IIRC工作良好,使用上述页面作为我的出发点。

一旦你已经发出了本金,这将是可用的,正常的,通过:

string cn = Thread.CurrentPrincipal.Identity.Name; 
相关问题