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で失敗します。おそらく、間違ったハンドラーを使用している/間違って初期化していると思いますか?
他にもいくつかポイントが足りないと思います
- 証明書利用者が誰であるかをADFSに特定することはできません。
- サービスを使用していないため、AppliesToを何に設定すればよいかわからなかったため、ADFSエンドポイントに設定しました。
それらのいずれかに関するアドバイスは素晴らしいでしょう。
WCF/構成ベースのアプローチ以外でこの例を見つけるのに本当に苦労しています。すべてがどのように機能するかをよりよく理解できるように、すべてをコードにまとめようとしています。