需要从客户端应用程序向STS中的UserNameSecurityToken传递其他值

时间:2011-11-09 05:25:58

标签: wif

我已经使用wif将安全性整合到我的wcf服务中。低于我的高级设计。

  1. Wif sts应用程序 - 这里我使用了自定义用户名安全令牌处理程序来验证usename&密码时应
  2. Wcf服务 - 服务列表
  3. 网络应用程序 - >我在哪里消费了wcf服务。
  4. STS自定义用户名安全令牌处理程序如下:

    public class CustomUserNameSecurityTokenHandler : UserNameSecurityTokenHandler
    {
        public override Microsoft.IdentityModel.Claims.ClaimsIdentityCollection ValidateToken(System.IdentityModel.Tokens.SecurityToken token)
        {
            UserNameSecurityToken userNameToken = token as UserNameSecurityToken;
            CredentialStore.AuthenticateUser(userNameToken.username, userNameToken.Password);
    
            // ...
        }
    }
    

    从Web应用程序使用wcf服务的代码

    ClientCredentials oldCredentials = client.Endpoint.Behaviors.Remove<ClientCredentials>();
    CachedClientCredentials newCredentials = new CachedClientCredentials(_tokenCache, oldCredentials);
    
    client.Endpoint.Behaviors.Add(newCredentials);
    
    client.ClientCredentials.UserName.UserName = "Admin"
    client.ClientCredentials.UserName.Password = "password";
    
    client.Authenticate();
    

    虽然使用wcf服务我能够将用户名和密码发送到STS validateToken方法进行身份验证,我的场景就像我想从Consu消息部分向validatetoken方法发送一个值(当前网站地址)。我有解决方法来发送用户名的附加值部分,但这不是一个好主意。

    那么请你帮我解决一下我的问题?

1 个答案:

答案 0 :(得分:2)

我已实施的STS服务除了用户名和密码外还需要ClientID。我在初始化服务客户端时通过在安全令牌请求中添加自定义元素来解决了这个问题。然后,STS服务在授权令牌时读出这些值,并在权利要求中传回ClientID。

// init client..
_serviceClient.ClientCredentials.UserName.UserName = Username;
_serviceClient.ClientCredentials.UserName.Password = Password;

var doc = new XmlDocument();
XmlElement customElement = doc.CreateElement("ExtraAuthData", Name, "http://localhost/STS/identity");
customElement.InnerText = Value;
(_serviceClient.Endpoint.Binding as WS2007FederationHttpBinding).Security.Message.TokenRequestParameters.Add(customElement);

不确定这是否是推荐方法,我找不到任何其他方法。