2017-11-08 8 views
1

저는 현재 Kentor AuthServices를 사용하여 SP가 시작한 SSO를 구현하는 과정에있는 Asp.Net 핵심 웹 응용 프로그램을 보유하고 있습니다. 이제 IDP에서 idP로부터 다음과 같은 형식으로 메타 데이터 파일을 받았습니다.Kentor AuthServices AuthnRequests Asp.Net 코어를 전송합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" 
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
entityID="https://exampleidp.com"> 
<md:IDPSSODescriptor 
protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> 
<md:KeyDescriptor use="signing"> 
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <X509Data> 
     <X509Certificate>ExampleCertificate</X509Certificate> 
     </X509Data> 
    </KeyInfo> 
</md:KeyDescriptor> 
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified 
</md:NameIDFormat> 
<md:SingleSignOnService 
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" 
Location="https://exampleidp.com/loginpage"/> 
<md:SingleLogoutService 
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" 
Location="https://exampleidp.com/logoutpage"/> 
<saml:Attribute Name="accountID" 
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 
FriendlyName="accountID"/> 
<saml:Attribute Name="email" 
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 
FriendlyName="email"/> 
<saml:Attribute Name="firstName" 
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 
FriendlyName="firstName"/> 
<saml:Attribute Name="lastName" 
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 
FriendlyName="lastName"/> 
</md:IDPSSODescriptor> 
<md:ContactPerson contactType="technical"> 
    <md:GivenName>Exampleidp</md:GivenName> 
    <md:SurName>Support</md:SurName> 
    <md:EmailAddress>[email protected]</md:EmailAddress> 
</md:ContactPerson> 
<md:Organization> 
    <md:OrganizationName xml:lang="en">Example Idp</md:OrganizationName> 
    <md:OrganizationDisplayName xml:lang="en">Example Idp</md:OrganizationDisplayName> 
    <md:OrganizationURL xml:lang="en">http://exampleidp.com/</md:OrganizationURL> 
</md:Organization> 
</md:EntityDescriptor> 

두 개의 서명 인증서가 있습니다. 내 Startup.cs에서 나는 ConfigureServices에 다음 코드를 추가했습니다 :

.AddSaml2(options => 
     { 
      options.SPOptions.EntityId = new EntityId("http://myapp.com"); 
      options.IdentityProviders.Add(
       new IdentityProvider(
        new EntityId("myapp.com/Metadata.xml"), options.SPOptions) 
       { 
        LoadMetadata = true 
       }); 
     }) 

및 구성에 다음 코드 :

app.UseAuthentication(); 

UPDATE

관통보고 후를 소스 코드 더보기 마침내 내 머리를 감쌀 수 있었고 다음과 같이 AuthnRequests를 생성 할 수있었습니다 (IDP로 확인) :

<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" 
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" 
ID="idcc70905185a04a94b05282e0c544e086" Version="2.0" IssueInstant="2017- 
11-13T14:47:56Z" 
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" 
AssertionConsumerServiceURL="http://myapp.com/saml"> 
    <saml2:Issuer>http://myapp.com</saml2:Issuer> 
    <saml2p:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid- 
    format:unspecified" AllowCreate="true" /> 
</saml2p:AuthnRequest> 

편집 : 내 주요 관심사는 지금은 IDP에 AuthnRequest를 보내야하는 방법이다. 올바른 방향에 있다면 IdP가 제대로 처리 할 수 ​​있도록 AuthnRequest를 수축 및 인코딩해야합니다. 나는 이것이 (이미 RelayState 정보를 포함 할 필요가있는 것처럼 보입니다.) 기존의 Kentor 코드를 사용하거나 나 자신을하기에 충분할 정도로 쉽게 달성 할 수 있을지 궁금합니다.

+0

_ idP에 전송해야하는 AuthnRequest를 작성해야합니다. _ 시도한 내용을 보여주는 코드를 제공하면 도움이됩니다. – Noel

+0

나는 내가 시도한 것에 대해 몇 가지 코드를 가지고 있다면 도움이 될 것이라고 이해한다.하지만이 시점까지는 패키지를 파헤 치고 구현 과정을 배우려고 노력해 왔으며, 이제는 꽤 많은 시간을 투자 한 후에 성공적인 구현에 가깝지 않았습니다. 그래서 나는 누군가가 올바른 방향으로 나를 안내 할 수 있거나 나에게 약간의 조언을 해줄 수 있기를 바란다. 나는이 시점에서 나 자신을 혼란스럽게 생각한다. 내가 가치있는 것을 생각해 내면 내가 가진 것을 편집하고 게시하게 될 것입니다. – Jared

답변

0
는 대답

최종 업데이트 : 많은 연구와 주변의 파고 후, 나는 마침내에 AuthnRequest을 설정 한 내 마지막 문제 었죠 것을 확인할 수 있었다 적절한 수축과 base64로는 전송 될 필요가 문자열을 인코딩 idP. IDP는에 의해 적절한 응답을 트리거

var param = ""; 
     var bytes = Encoding.UTF8.GetBytes(authnRequest.ToXElement().ToString()); 
     using (var output = new MemoryStream()) 
     { 
      using (var zip = new DeflateStream(output, CompressionMode.Compress)) 
      { 
       zip.Write(bytes, 0, bytes.Length); 
      } 
      var base64String = Convert.ToBase64String(output.ToArray()); 
      param = HttpUtility.UrlEncode(base64String); 
     } 

내가 제대로 내 SP에 대한 SSO를 트리거하고 IDP에서 응답 값을 잡을 수 있어요 : 나는 다음과 같은 코드 덩어리를 사용하여이를 달성했다.