C를 사용한 SAML SSO(Single Sign On) 통합 작업 예제 #

19890 단어 integrationssoapisaml

SSO(Single Sign On) 란 무엇입니까?


만약 당신이 웹 응용 프로그램을 가지고 있다면, 사람들은 그것을 이용하여 한 가지 일을 하지만, 당신은 아주 잘한다.예를 들어 인터넷에서 찾은 재미있고 예쁜 사진을 올려 맞춤형 티셔츠 인쇄물을 주문할 수 있는 인터넷 상점이 될 것이다.
사용자에게 더 많은 기능을 추가해서 기능을 확장하는 방법을 찾고 있지만, 이 일에 대한 관심을 잃고 싶지 않습니다. 이것은 당신이 가장 잘하는 일이기 때문입니다.
한 가지 방법은 웹 응용 프로그램을 다른 서비스와 통합시키는 것입니다. 예를 들어 멋진 이미지 공급자, 트렌드 측정기, 납품 서비스 등입니다. 사용자가 다른 서비스 사이를 틈새 없이 이동할 수 있도록 합니다. (예를 들어 멋진 이미지를 찾거나 트렌드를 검사하고 이 이미지를 사용자 정의 프린터 서비스에 불러올 수 있습니다.) 웹 응용 프로그램으로만 여러 가지 작업을 수행할 수 있습니다.
Single Sign-On은 인증 절차를 간소화하고 사용자가 로그인/비밀번호(또는 FIDO2, 만약에 이런 메커니즘을 사용한다면)를 한 번만 로그인하고 간단한 클릭을 통해 더욱 통합된 서비스를 사용할 수 있도록 한다. 반복적으로 로그인할 필요가 없다.그것은 당신이 상대적으로 낮은 투자로 더 많은 가치를 증가시켜 제품의 기능을 확장할 수 있도록 허락한다.

사미르


SAML은 SSO(Single Sign On) 방식의 표준 중 하나입니다.오랫동안 광범위한 엔터프라이즈 서비스에서는 이 메커니즘을 로그인 이름, 암호, 이메일, 사용자 계정 등과 같은 중요한 인증 및 권한 수여 정보를 교환하는 가장 안전하고 경험적인 방법 중 하나로 사용해 왔습니다. 그러나 소규모 기업 간에 이 솔루션을 추가하고 쿨한 통합을 실현하는 것은 그리 복잡하지 않습니다.
많은 다른 옵션 중에서SAML은 제3자와 통합하는 가장 안전한 방식 중의 하나이다.보안 X.509 인증서 기반의 비대칭 암호화(RSA)를 사용할 수 있습니다.2021년 기준 version 2.
많은 기존 패키지 솔루션 중 하나를 믿는 것이 좋습니다. 이 해결 방안들은 검증된 역사를 가지고 코드와 전체적인 해결 방안을 담당하는 공급업체에서 나온 것입니다.그러나 개발자로서 저는 기업이 더 큰 유연성과 제품 맞춤형 제작을 필요로 할 수 있다는 것을 알고 있기 때문에 더 많은 세부 사항과 C#를 사용하는 업무 예시를 제공하여 당신이 쉽게 ASP에 있을 수 있도록 하고 싶습니다.NET 애플리케이션

SAML 워크플로우


일반적으로 클래식 SAML 워크플로우에는
  • 서비스 제공업체 -
  • 과 통합하고자 하는 타사 서비스입니다.
  • 신분 제공자 - 이것은 (기업) 트러스식 신분 검증 서비스로 사용자의 신분을 증명하고 서비스 제공자에게 "그는 괜찮아!"라고 알려줄 수 있다.
  • 사용자 에이전트 - 사용자
  • 웹 스토어가 있는 브라우저 열기
    이'클래식'장면은 기업에 적합하기 때문에 우리는 이곳에 너무 오래 머무르지 않을 것이다.아래 워크플로우 다이어그램을 볼 수 있으며 Wikipedia에 자세히 설명되어 있습니다.

    그런데 우리는 작은 기업이야, 그렇지?따라서 일반적인 상황에서 우리는 기업급 신분 공급자와 복잡한 협의가 없지만 제3자와 통합해야 한다.그것이 우리에게 어떤 모습이어야 하는지 보여 주세요.

    통합의 첫 단계


    첫 번째는 서비스 제공자와 협의를 체결하여 귀하의 서비스와 통합하는 것입니다.이번에 우리는SAML 프로토콜에 전문적으로 관심을 가지지만, 나는 많은 중소형 서비스들이 사용하는 더욱 취약한 맞춤형 통합 알고리즘을 안다.이들은 맞춤형 HTTP API, REST, WCF, XML과 JSON 기반 데이터 형식, JWTokens와 OAuth를 사용하고 때로는 모든 내용을 결합하기도 한다.어떤 옵션을 사용하든지, 초기 테스트 연결을 만들기 위해 설정 파라미터를 제공해야 합니다.
    SAML 기반의 통합에 대해 그들은 이른바 '메타데이터 정보' 를 제공할 것을 요구할 것이다이것은 서비스에 대한 정보를 포함하는 작은 XML 파일입니다.서비스 공급자 대표는 이 파일을 사용하여 자동으로 인증(또는 테스트) 노드를 만들고 있습니다. 이 노드는 연결을 테스트하고 모든 장애를 해결하며 공개되기 전에 모든 내용을 인증할 수 있습니다.
    여기서 중요한 부분은 이 파일의 XML 내용입니다. 개인 X.509 인증서 (즉 RSA의 개인 키) 를 사용하여 서명해야 합니다.물론, 너는 반드시 하나를 사야 한다.일부 공급자는 자가 서명 증빙서류를 사용하여 테스트를 할 수 있다.이것은 당신과 서비스 제공자의 협의 문제입니다.
    GitHub 계정에서 공개적으로 얻을 수 있는 소스 코드를 준비했습니다.This small console application에서는 메타데이터를 생성할 수 있습니다.xml 파일을 사용하고 개인 키로 정확하게 서명합니다.
    공용 X.509 인증서(as a *.crt file, or PEM text)와 이 메타데이터를 보내야 합니다.xml은 보안 채널을 통해 전송됩니다.
    서비스 제공자가 일부 연결 노드에 회답을 하면 첫 번째 부분은 끝날 수 있습니다.

    통합 워크플로우


    인증 작업 흐름을 실현하고 사용자가 로그인 이름과 비밀번호를 사용하여 로그인할 수 있도록 하는 웹 응용 프로그램이 있습니다.이것은 당신이 신분 제공자라는 것을 의미한다. 이렇게 하면, 당신은 불필요한 절차를 없애고 절차를 더욱 간단하게 할 수 있다.따라서 다음과 같이 ID 제공업체와 인터넷 스토어를 하나의 실체로 통합한다고 생각해 보십시오.

    그것은 전체 화면을 간소화했다.하지만 그리 간단하지는 않다.최종적으로SAMLResponse라는 XML 문서를 준비하고Base64로 인코딩해야 합니다.HTTP POST 요청을 통해 이 문서를 서비스 공급자에게 보내서 사용자의 신분을 검증하고 브라우저를 제3자 대상 서비스로 자동으로 다시 지정해야 합니다. 아래 그림의 상세한 절차를 참고하십시오.

    마찬가지로, 나는 이미 a set of utility classes written in C#을 준비했기 때문에, 웹 응용 프로그램에서 이러한 절차를 어떻게 실행하는지 쉽게 볼 수 있습니다.
    다음은 이 과정의 모든 중요한 부분에 대한 나의 평론을 찾을 수 있다.그러나 나는 클래스 SamlIntegrationSteps.cs->method Build Encoded Saml Response(...)의 절차에 따라 조작하는 것이 훨씬 쉽다고 믿는다.
    첫걸음SAML 선언 XML을 만드는 것이 일반적인 XML 문서를 만드는 것보다 어렵지 않습니다.단, 서비스 공급자가 제공하는SAML 규범과 문서를 따라야만 적당한 필드 이름을 사용할 수 있습니다.이곳의 업무 예는 SamlAssertionAlgorithms.cs이다.
    AssertionType assertion = new AssertionType
    {
        ID = ...Assertion Id ...,
        IssueInstant = ...UTC Time...,
        Version = "2.0",
        Issuer = new NameIDType
        {
            Value = "...your Web Store URL here..."
        },
        Subject = new SubjectType
        {
            Items = new object[]
            {
                new NameIDType
                {
                    Format = "urn:oasis:names:tc:SAML:2.0:nameid-format:emailAddress",
                    Value = userData.GetUserEmail()
                },
                new SubjectConfirmationType
                {
                    Method = "urn:oasis:names:tc:SAML:2.0:cm:bearer",
                    SubjectConfirmationData = new SubjectConfirmationDataType
                    {
                        NotOnOrAfter = ...UTC Time....AddMinutes(3),
                        NotOnOrAfterSpecified = true,
                        Recipient = settings.Recipient
                    }
                }
            }
        },
        Conditions = new ConditionsType
        {
            NotBefore = ...UTC Time...,
            NotBeforeSpecified = true,
            NotOnOrAfter = ...UTC Time....AddMinutes(3),
            NotOnOrAfterSpecified = true,
            Items = ...conditions that you need...
        },
        Items = new StatementAbstractType[]
        {
            new AttributeStatementType
            {
                // ReSharper disable once CoVariantArrayConversion
                Items = ...attributes array...
            },
            new AuthnStatementType
            {
                AuthnInstant = ...UTC Time...,
                SessionIndex = ...Assertion Id ...,
                AuthnContext = new AuthnContextType
                {
                    ItemsElementName = new [] { ItemsChoiceType5.AuthnContextClassRef },
                    Items = new object[] { "urn:federation:authentication:windows" }
                }
            }
        }
    };
    
    두 번째 단계.SAML 단언의 서명은 공식 Microsoft docs의 설명에 따라 완성할 수 있다.이곳의 업무 예는 SamlAssertionAlgorithms.cs이다.
    세 번째.SAML 단언의 암호화는 SamlAssertionAlgorithms.cs에서 System을 사용하여 수행됩니다.보안암호학.Xml.
    X509Certificate2 x509 = ...get certificate...
    
    xmlElement.SigningKey = x509.PrivateKey;
    xmlElement.SignedInfo.CanonicalizationMethod = SamlSignedXml.XmlDsigExcC14NTransformUrl;
    
    // Create a reference to be signed. 
    Reference reference = new Reference
    {
        Uri = "#" + referenceValue
    };
    
    reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
    reference.AddTransform(new XmlDsigExcC14NTransform());
    
    // Add the reference to the SignedXml object. 
    xmlElement.AddReference(reference);
    
    // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate). 
    KeyInfo keyInfo = new KeyInfo();
    keyInfo.AddClause(new KeyInfoX509Data(certificate));
    
    xmlElement.KeyInfo = keyInfo;
    
    // Compute the signature. 
    xmlElement.ComputeSignature();
    
    // Put the sign as the first child of main Request tag.
    xmlAssertion?.InsertAfter(xmlElement, xmlAssertion.ChildNodes[0]);
    
    네 번째 단계.SAMLResponse에 선언 문서를 추가하는 것은 XML만 추가하는 것입니다.
    XmlDocument encryptedAssertion = new XmlDocument();
    
    // Add namespaces
    XmlDeclaration xmlDeclaration = encryptedAssertion.CreateXmlDeclaration("1.0", "UTF-8", null);
    XmlElement encryptedRoot = encryptedAssertion.DocumentElement;
    encryptedAssertion.InsertBefore(xmlDeclaration, encryptedRoot);
    
    // Form Assertion element
    XmlElement encryptedAssertionElement = encryptedAssertion.CreateElement("saml",
        "EncryptedAssertion", "urn:oasis:names:tc:SAML:2.0:assertion");
    encryptedAssertion.AppendChild(encryptedAssertionElement);
    
    // Add encrypted content
    var encryptedDataNode = encryptedAssertion.ImportNode(encryptedData.GetXml(), true);
    encryptedAssertionElement.AppendChild(encryptedDataNode);
    
    // Form a document
    var root = xmlDocument.DocumentElement;
    var node = root.OwnerDocument.ImportNode(encryptedAssertionElement, true);
    root.RemoveChild(xmlAssertionSource ?? throw new InvalidOperationException());
    root.AppendChild(node);
    
    다섯 번째.SAMLResponse에 서명하는 것은 서명 단언과 거의 같다.이곳의 업무 예는 SamlResponseAlgorithms.cs이다.

    결말


    일부 서비스 제공자는 특정 절차를 피할 수 있고 서명이나 암호화가 필요하지 않을 수도 있다.이 경우 코드의 이 부분을 삭제할 수 있습니다.전반적으로 말하자면, 당신의 응용 프로그램에서 제 예시를 마음대로 사용하십시오. 이것은 당신과 당신의 응용 프로그램이 사용자를 끌어들이고 고객층을 확대하는 데 도움을 줄 수 있기를 바랍니다.
    건배!

    관련 링크


    Examples of SAML responses
    Tips&Tricks on documenting custom API .

    좋은 웹페이지 즐겨찾기