我正在开发一个WCF Web服务,以在用户的登录操作与其活动目录角色和权限之间建立中介。我不希望我的主机应用程序直接与AD FS通信。我希望任何主机应用程序都使用我的Web服务,它将根据给定的凭证提供必要的信息。
在我的网络方法中,我需要通过用户的登录凭据从AD FS(WIF)获取声明。
我的网络方法将有两个输入参数,即窗口用户的电子邮件ID / Windows帐户名称和密码。
因此,我希望通过给定用户的凭证在我的Web方法中访问AD FS声明。
我如何通过给定用户的凭证获得AD FS声明?
答案 0 :(得分:7)
您应该对使用集成Windows身份验证的AD FS 2.0的https://.../adfs/services/trust/13/usernamemixed端点执行Web服务调用,提供用户的凭据,以便可以建立连接建立。在此端点上,调用http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue操作。 (更多详细信息在section 4.1 of the WS-Trust 1.3 specification中。)此操作的输入是RequestSecurityToken请求。响应包含一个SAML令牌,其中包含您需要的声明。
请注意,AD FS 2.0 WSDL可以在https://.../adfs/services/trust/mex上找到:如果您指向Visual Studio Add Service Reference向导或Java wsimport ,然后您可以轻松生成可用于执行RST问题操作的客户端代码。
答案 1 :(得分:5)
您可以从ADFS请求DisplayTokem并使用它,它与令牌中的信息基本相同。
public DisplayClaimCollection GetDisplayClaims(string username, string password)
{
WSTrustChannelFactory factory = null;
try
{
// use a UserName Trust Binding for username authentication
factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
"https://.../adfs/services/trust/13/usernamemixed");
factory.TrustVersion = TrustVersion.WSTrust13;
factory.Credentials.UserName.UserName = username;
factory.Credentials.UserName.Password = password;
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
AppliesTo = "Relying party endpoint address",
KeyType = KeyTypes.Symmetric,
RequestDisplayToken = true
};
IWSTrustChannelContract channel = factory.CreateChannel();
RequestSecurityTokenResponse rstr;
SecurityToken token = channel.Issue(rst, out rstr);
return rstr.RequestedDisplayToken.DisplayClaims;
}
finally
{
if (factory != null)
{
try
{
factory.Close();
}
catch (CommunicationObjectFaultedException)
{
factory.Abort();
}
}
}
}
但这不是正确的做法! 您应该使用RelyingParty证书解密加密的令牌并从中读取声明。