25

私の文脈:

  • .Net RESTful Web サービス
  • クライアント (混合プラットフォーム、テクノロジー、lib 機能) が SAML トークンを取得しました
  • REST サービスで認証/認可用のトークンを受け入れようとしています
    • HTTP Authorization / X-Authorization ヘッダー内
    • クエリ パラメータとして
  • 後で SWT もサポートしますが、SAML トークンを取得する必要があります

詳細:

文字列に SAML トークンがあります。

<saml:Assertion xmlns:saml="..." ...> ..etc... </>

HttpModule では、これを ClaimsPrincipal に変換して、サービスが通常の Thread.CurrentPrincipal を IClaimsPrincipal として実行できるようにします。

いくつかの魅力的なページ/ブログ/その他を見つけました...参考になりました:

私は文字通りSAMLトークンをClaimsPrincipalに変換しようとして立ち往生しています(SecurityTokenの中間ステップまたは直接... どちらの方法でも満足しています)。Cibrax のアイデアのサンプル コードでは、重要な検証と逆シリアル化の手順に次のコードを使用しています。

SecurityTokenSerializer securityTokenSerializer 
    = new SecurityTokenSerializerAdapter(
        FederatedAuthentication.SecurityTokenHandlers, 
        MessageSecurityVersion.Default.SecurityVersion, 
        false, new SamlSerializer(), null, null);

SecurityToken theToken 
    = WSFederationAuthenticationModule.GetSecurityToken(
        theSamlTokenInStringForm, securityTokenSerializer);

私がぶつかった壁は、WIF の RTM バージョンが GetSecurityToken のこのオーバーロードを公開していないことです...それは公開するだけです:

WSFederationAuthenticationModule fam = new WSFederationAuthenticationModule();
SecurityToken theToken = fam.GetSecurityToken(HttpRequest theRequest);
SecurityToken theToken = fam.GetSecurityToken(SignInResponseMessage message);

立ち往生するのを手伝ってくれてありがとう!

タイラー

4

4 に答える 4

3

これは役に立ちました。 http://www.tecsupra.com/blog/system-identitymodel-manually-parsing-the-saml-token/

基本的な考え方: 「Audience」ノードの XML が必要です。次に、SecurityTokenHandlerCollection を使用して、「ValidateToken」を使用できます。

投稿から:

       string samlTokenXml = signInResponseXml
            .DocumentElement  // <trust:RequestSecurityTokenResponseCollection>
            .ChildNodes[0] // <trust:RequestSecurityTokenResponse>
            .ChildNodes[2] // <trust:RequestedSecurityToken>
            .InnerXml; // <Assertion>

        var xmlTextReader = new XmlTextReader(new StringReader(samlTokenXml));

        SecurityTokenHandlerCollection handlers = 
       FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;

        // read the token
        SecurityToken securityToken = handlers.ReadToken(xmlTextReader);
于 2013-09-16T14:16:15.983 に答える
1

基本的に同じシナリオを実装するのに非常に役立つリソースをいくつか共有したいと思います。基本的に、ドミニク・バイエルはこの空間の神です。彼のブログには、この件に関する素晴らしい情報がたくさんあります。

http://leastprivilege.com/

RESTful サービスで SAML/SWT トークンを IClaimsIdentity に変換する場合:

http://www.develop.com/wcfrest/

http://identitymodel.codeplex.com/

于 2012-09-27T14:03:58.480 に答える
0

わかりました、いくつかの進歩...次のことを行うと、さらに進みます:

Microsoft.IdentityModel.Configuration.ServiceConfiguration serviceConfig
    = new Microsoft.IdentityModel.Configuration.ServiceConfiguration();

// Now read the token and convert it to an IPrincipal
SecurityToken theToken = null;
ClaimsIdentityCollection claimsIdentity = null;
using (XmlReader reader = XmlReader.Create(new StringReader(authSamlString)))
{
    theToken = serviceConfig.SecurityTokenHandlers.ReadToken(reader);
    claimsIdentity = serviceConfig.SecurityTokenHandlers.ValidateToken(theToken);
}

IPrincipal principal = new ClaimsPrincipal(claimsIdentity);

次にぶち当たった壁:

ここで、ウィザードによって生成された REST サービスのホスト割り当てで例外が発生しています。

<%@ ServiceHost Language="C#" Debug="true" Service="Sample.RestService.Service" Factory="Sample.RestService.AppServiceHostFactory"%>

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using Microsoft.ServiceModel.Web.SpecializedServices;

namespace Sample.RestService 
{
  class AppServiceHostFactory : ServiceHostFactory
  {
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        /// ***** The exception occurs on the next line *****
        return new SingletonServiceHost(serviceType, baseAddresses);
    }
  }
}

例外の詳細:

System.Configuration.ConfigurationErrorsException occurred
  Message="This element is not currently associated with any context"
  Source="System.Configuration"
  BareMessage="This element is not currently associated with any context"
  Line=0
  StackTrace:
       at System.Configuration.ConfigurationElement.get_EvaluationContext()
  InnerException: {{NONE}}
于 2010-04-02T18:22:27.557 に答える
0

最後の例外を解決するには、タグとその内容を確認し、正しいことを確認してください。どの要素に問題があるかはわかりません。このエラーが何度か発生しますが、その理由は常に、identitymodel セクションの形式が正しくありませんでした。

于 2011-12-13T10:29:06.420 に答える