Я работаю над консольным приложением в качестве доказательства концепции аутентификации через AD FS. Код, который у меня есть до сих пор,
using System.IdentityModel.Protocols.WSTrust;
using System.IdentityModel.Tokens;
using System.IO;
using System.Linq;
using System.Security.Claims;
using System.ServiceModel;
using System.ServiceModel.Security;
using System.Xml;
using Thinktecture.IdentityModel.WSTrust;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var factory = new WSTrustChannelFactory(new WindowsWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress("https://dcadfs.security.net/adfs/services/trust/13/windowsmixed"))
{
TrustVersion = TrustVersion.WSTrust13
};
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
KeyType = KeyTypes.Bearer,
AppliesTo = new EndpointReference("https://dcadfs.security.net/adfs/services/trust/13/windowsmixed")
};
var channel = factory.CreateChannel();
var genericToken= channel.Issue(rst) as GenericXmlSecurityToken;
if (genericToken != null)
{
var sh = new WindowsUserNameSecurityTokenHandler();
//Next line errors with ID4065: Cannot read security token. Exepected elemt is username
var token = sh.ReadToken(new XmlTextReader(new StringReader(genericToken.TokenXml.OuterXml)));
var claimsPrincipal = new ClaimsPrincipal(sh.ValidateToken(token2).First());
}
}
}
}
Он не работает с ReadToken с ожидаемой ошибкой элемента имени, я думаю, что, вероятно, использую неправильный обработчик/неправильно его инициализирую?
Я также думаю, что мне не хватает пары других моментов
- Я ни в коем случае не идентифицирую AD FS, кто является проверяющей стороной.
- Я не был уверен, что установить для AppliesTo, поскольку я не использую службу, поэтому я установил конечную точку AD FS.
Любой совет по любому из них был бы замечательным.
Действительно изо всех сил пытается найти примеры этого за пределами подхода, основанного на WCF/конфигурации. Я пытаюсь получить все это в коде, чтобы лучше понять, как все это работает.