Я пытаюсь настроить службу WCF
, защищенную ADFS
. Я в настоящее время в состоянии запросить маркер и отправить его с запросом, используя WIF
и Thinktecture IdentityModel 4.5
со следующим кодом:Включая токен SAML2.0 в вызове службы WCF без использования WIF
static SecurityToken GetToken()
{
var factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
"https://fs2.server2012.local/adfs/services/trust/13/usernamemixed")
{
TrustVersion = TrustVersion.WSTrust13
};
if (factory.Credentials != null)
{
factory.Credentials.UserName.UserName = @"username";
factory.Credentials.UserName.Password = "password";
}
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
KeyType = KeyTypes.Symmetric,
AppliesTo = new EndpointReference(
"https://wcfservicecertificate/wcfservice/Service.svc/wstrust"),
};
var channel = factory.CreateChannel();
RequestSecurityTokenResponse rstr;
return channel.Issue(rst, out rstr);
}
С этим я могу вызвать службу WCF с помощью ChannelFactory.CreateChannelWithIssuedToken
:
var factory = new ChannelFactory<IService>(binding,
new EndpointAddress("https://wcfservicecertificate/wcfservice/Service.svc/wstrust"));
if (factory.Credentials != null)
{
factory.Credentials.SupportInteractive = false;
factory.Credentials.UseIdentityConfiguration = true;
}
var proxy = factory.CreateChannelWithIssuedToken(GetToken());
var result= proxy.GetData(2);
Это работает так, как ожидалось, но может использоваться только на (мобильных) платформах Windows. Я также хотел бы иметь возможность использовать тот же принцип для iOS и Android. Использование this article я был в состоянии запросить маркер безопасности от ADFS, используя следующий код:
const string soapMessage =
@"<s:Envelope xmlns:s=""http://www.w3.org/2003/05/soap-envelope""
xmlns:a=""http://www.w3.org/2005/08/addressing""
xmlns:u=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"">
<s:Header>
<a:Action s:mustUnderstand=""1"">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue</a:Action>
<a:To s:mustUnderstand=""1"">https://fs2.server2012.local/adfs/services/trust/13/UsernameMixed</a:To>
<o:Security s:mustUnderstand=""1"" xmlns:o=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"">
<o:UsernameToken u:Id=""uuid-6a13a244-dac6-42c1-84c5-cbb345b0c4c4-1"">
<o:Username>username</o:Username>
<o:Password Type=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"">password</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
<s:Body>
<trust:RequestSecurityToken xmlns:trust=""http://docs.oasis-open.org/ws-sx/ws-trust/200512"">
<wsp:AppliesTo xmlns:wsp=""http://schemas.xmlsoap.org/ws/2004/09/policy"">
<a:EndpointReference>
<a:Address>https://wcfservicecertificate/wcfservice/Service.svc/wstrust</a:Address>
</a:EndpointReference>
</wsp:AppliesTo>
<trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/SymmetricKey</trust:KeyType>
<trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
<trust:TokenType>urn:oasis:names:tc:SAML:2.0:assertion</trust:TokenType>
</trust:RequestSecurityToken>
</s:Body>
</s:Envelope>";
var webClient = new WebClient();
webClient.Headers.Add("Content-Type", "application/soap+xml; charset=utf-8");
var result = webClient.UploadString(
address: "https://fs2.server2012.local/adfs/services/trust/13/UsernameMixed",
method: "POST",
data: soapMessage);
Это приводит к самому SAML2.0, который я хотел бы отправить в запросе нашей службы WCF для проверки подлинности. Существуют различные источники (включая упомянутую выше статью), в которых говорится, что это должно быть возможно, но я еще не нашел решения.
Любая помощь будет оценена по достоинству.
I не знаю ответа на это, но вскоре мне придется самому решать такие проблемы, поэтому я взял на себя это упражнение. Из моих исследований кажется, что более точное изложение проблемы заключается в том, «где в сообщении служба WCF ожидает, что токен будет?». Я еще не смог заставить Google дать мне прямой ответ на этот вопрос. Удачи! –
Просто идея, но если вы используете WebClient для получения токена SAML, я бы предположил, что вы собираетесь использовать WebClient или другой http-клиент, чтобы сделать запрос к конечной точке WCF. Если это так, вы можете проверить свой рабочий http-запрос (верхний код C#) с помощью инструмента, такого как Fiddler, а затем дублировать его с помощью WebClient. – GemCer
Я предлагаю вам использовать токены OAuth 2 и JWT вместо WS-Trust и SAML. –