我真的很感激帮助理解如何在本地桌面应用中使用声明。这是场景:我想显示一个标签f.e.取决于用户是否有“AnalysisAllowed:true”这样的声明。所以我想在应用程序启动时获取声明并在以后绑定它们。
所有样本都在谈论如何让WCF使用授权和身份验证管理器对其他WCF服务进行基于声明的调用,但我只是想联系sts(我该怎么做?WCF-Fed Binding?)和而不是缓存使用它的东西。没有其他服务电话......:)
非常感谢!
答案 0 :(得分:2)
在默认配置(客户端和STS)中,您获得的令牌将被加密(除了被签名)。如果您拥有整个事物(客户端和服务),那么您可以调整一些旋钮,以便令牌可以“#34;可读"来自客户(因此,未加密)。
这里有一些代码可以从ADFS中为您提供未加密的SAML令牌(关键是要求一个" bearer"令牌并配置没有加密证书的ADFS信赖方)。
private static SecurityToken GetSamlToken(string realm, string stsEndpoint, ClientCredentials clientCredentials)
{
using (var factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
new EndpointAddress(new Uri(stsEndpoint))))
{
factory.Credentials.UserName.UserName = clientCredentials.UserName.UserName;
factory.Credentials.UserName.Password = clientCredentials.UserName.Password;
factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
factory.TrustVersion = TrustVersion.WSTrust13;
WSTrustChannel channel = null;
try
{
var rst = new RequestSecurityToken
{
RequestType = WSTrust13Constants.RequestTypes.Issue,
AppliesTo = new EndpointAddress(realm),
KeyType = KeyTypes.Bearer,
};
channel = (WSTrustChannel)factory.CreateChannel();
return channel.Issue(rst);
}
finally
{
if (channel != null)
{
channel.Abort();
}
factory.Abort();
}
}
获得令牌后,您可以使用LINQ to XML或WIF从SecurityToken中获取ClaimsIdentity。确保在客户端与STS和服务之间使用SSL。
您拥有的第二个选择是依靠服务来返回声明列表。它还有一个请求,但您将在用户登录的同时执行此操作,然后在令牌过期之前缓存这些声明。
public IEnumerable<Claim> GetUserClaims() {
// get Thread.CurrentPricinpal IClaimsIdentity and grab the claims
}
答案 1 :(得分:0)
我不确定您使用的是什么STS,但通常(例如,使用AD FS 2.0),您将使用WS-Trust连接到STS Web服务。这是主动联合与被动联合。
请参阅实验4 here以获取有关如何执行此操作的示例。