사용자 지정 바인딩에 Saml Assertion 추가

Nov 14 2020

이 CustomBinding이 있습니다.

            var sec = new AsymmetricSecurityBindingElement(
            new X509SecurityTokenParameters(X509KeyIdentifierClauseType.Any, SecurityTokenInclusionMode.Never),
            new X509SecurityTokenParameters(X509KeyIdentifierClauseType.Any, SecurityTokenInclusionMode.AlwaysToRecipient));
            sec.MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
            sec.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
            sec.IncludeTimestamp = true;
            sec.SetKeyDerivation(false);
            sec.KeyEntropyMode = System.ServiceModel.Security.SecurityKeyEntropyMode.ServerEntropy;
            sec.EnableUnsecuredResponse = true;

            CustomBinding myBinding = new CustomBinding();
            myBinding.Elements.Add(sec);

            myBinding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
            myBinding.Elements.Add(new HttpsTransportBindingElement());

다음과 같은 SAML 어설 션을 추가하고 싶습니다.

        <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" saml:ID="authorization-assertion" saml:IssueInstant="2020-11-12T09:10:27Z" saml:Version="2.0" wsu:Id="authorization-assertion" xsi:schemaLocation="urn:oasis:names:tc:SAML:2.0:assertion saml-schema-assertion-2.0.xsd">
        <saml:Issuer>COMPANY</saml:Issuer>
        <saml:Subject>
            <saml:nameID>02942630753.localhost.com</saml:nameID>
        </saml:Subject>
        <saml:AuthzDecisionStatement Decision="Permit" Resource="IDocument">
            <saml:Action Namespace="http://FSE/IDocumentService"/>
        </saml:AuthzDecisionStatement>
        <saml:AttributeStatement/>
    </saml:Assertion>

myBinding.Elements.Add ()를 사용할 수 있다고 생각했지만 Assertion 요소를 구성하는 방법을 모르겠습니다.

답변

jdweng Nov 14 2020 at 11:11

어제 이전 게시물에서 말했듯이 파일에서 템플릿을 읽습니다. xml linq를 사용하여 아래 코드와 같은 코드에 넣을 수도 있습니다. 파일에서 읽는 경우 Parse () 메서드를 Load () 메서드로 바꿉니다. :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            string assertion = 
                "<saml:Assertion xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\"" + 
                    " xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\"" + 
                    " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + 
                    " saml:ID=\"authorization-assertion\"" +
                    " saml:IssueInstant=\"2020-11-12T09:10:27Z\"" +
                    " saml:Version=\"2.0\"" +
                    " wsu:Id=\"authorization-assertion\"" + 
                    " xsi:schemaLocation=\"urn:oasis:names:tc:SAML:2.0:assertion saml-schema-assertion-2.0.xsd\">" +
  
                    "<saml:Issuer>COMPANY</saml:Issuer>" +
                    "<saml:Subject>" +
                        "<saml:nameID>02942630753.localhost.com</saml:nameID>" +
                    "</saml:Subject>" +
                    "<saml:AuthzDecisionStatement Decision=\"Permit\" Resource=\"IDocument\">" +
                        "<saml:Action Namespace=\"http://FSE/IDocumentService\"/>" +
                    "</saml:AuthzDecisionStatement>" +
                    "<saml:AttributeStatement/>" +
                "</saml:Assertion>";

            XDocument doc = XDocument.Parse(assertion);
        }
    }
}