aro*_*roy 9 sharepoint web-services saml single-sign-on
我需要编写一个基于桌面的客户端应用程序,在执行基于SAML的SSO身份验证之后,它会对SharePoint服务器执行一些Web服务方法调用.
我发现SAML SSO主要用于浏览器,它负责处理所有细节.根据这个问题,似乎SAML 2.0中有一项名为ECP的技术仅用于启用非基于浏览器的客户端.
但是,某些应用程序(如SharePoint 2010/2013)仅支持SAML 1.1; 在这种情况下可以使用什么?
你没有提到技术——我可以分享我的经验。我们需要在使用 WCF 服务的桌面应用程序 (WPF) 中具有 SSO。我已开始使用此链接中的信息。解决方案是使用 WIF 从身份提供商检索 SAML 令牌,并使用它建立与后端服务器的连接。
获取令牌
WSTrustChannelFactory GetTrustFactory()
{
var binding = new WS2007HttpBinding(TrustChannelBindingConfiguration);
return new WSTrustChannelFactory(binding, StServiceUri);
}
SecurityToken GetTokenFromSts()
{
using (var trustFactory = GetTrustFactory())
{
// here is the code to set trustFactory.Credentials
trustFactory.TrustVersion = TrustVersion.WSTrust13;
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
AppliesTo = new EndpointReference(YourServiceUri),
KeyType = KeyTypes.Bearer
};
var channel = (WSTrustChannel) trustFactory.CreateChannel();
try
{
return channel.Issue(rst);
}
catch (MessageSecurityException msex)
{
channel.Abort();
throw new EMException(msex.InnerException.Message, msex);
}
}
}
Run Code Online (Sandbox Code Playgroud)然后将获得的token用于服务调用:
securityToken = GetToken();
// 2. Create a channel with issued token to YourServiceInterface
// create binding and turn off sessions
var binding = new WS2007FederationHttpBinding(FederationBinding);
try
{
var factory = new ChannelFactory<YourServiceInterface>(binding,
new EndpointAddress(YourServiceUri));
factory.Credentials.SupportInteractive = false;
var channel = factory.CreateChannelWithIssuedToken(securityToken);
// 3. Call YourMethod() on secured channel
return channel.YourMethod();
}
catch {...}
Run Code Online (Sandbox Code Playgroud)链接中的主要方法并没有真正改变 - 我们只是添加了令牌缓存并将此代码合并到我们的通道处理框架中。该代码用于根据 ADFS 服务器对桌面客户端进行身份验证,并使用后端服务器中的声明进行授权。