Skip to content

Commit f29670e

Browse files
authored
Merge pull request #117 from waterkip/GH-116-signing_and_encryption_key
Fix bug where two keys with different usage fails
2 parents c57b2b3 + e95e7c2 commit f29670e

File tree

7 files changed

+181
-79
lines changed

7 files changed

+181
-79
lines changed

Makefile.PL

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ my %WriteMakefileArgs = (
7676
"URI::URL" => 0,
7777
"XML::LibXML::XPathContext" => 0
7878
},
79-
"VERSION" => "0.59",
79+
"VERSION" => "0.60",
8080
"test" => {
8181
"TESTS" => "t/*.t t/author/*.t"
8282
}

README

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ NAME
22
Net::SAML2 - SAML2 bindings and protocol implementation
33

44
VERSION
5-
version 0.59
5+
version 0.60
66

77
SYNOPSIS
88
See TUTORIAL.md for implementation documentation and

lib/Net/SAML2.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use strict;
22
use warnings;
33
package Net::SAML2;
4-
our $VERSION = "0.59";
4+
our $VERSION = "0.60";
55

66
require 5.008_001;
77

lib/Net/SAML2/IdP.pm

Lines changed: 54 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
use strict;
2-
use warnings;
31
package Net::SAML2::IdP;
2+
use Moose;
3+
44
# VERSION
55

6-
use Moose;
76
use MooseX::Types::URI qw/ Uri /;
87

98
# ABSTRACT: Net::SAML2::IdP - SAML Identity Provider object
@@ -121,36 +120,24 @@ sub new_from_xml {
121120

122121
my $data;
123122

124-
for my $sso (
125-
$xpath->findnodes(
126-
'//md:EntityDescriptor/md:IDPSSODescriptor/md:SingleSignOnService')
127-
)
128-
{
123+
my $basepath = '//md:EntityDescriptor/md:IDPSSODescriptor';
124+
125+
for my $sso ($xpath->findnodes("$basepath/md:SingleSignOnService")) {
129126
my $binding = $sso->getAttribute('Binding');
130127
$data->{SSO}->{$binding} = $sso->getAttribute('Location');
131128
}
132129

133-
for my $slo (
134-
$xpath->findnodes(
135-
'//md:EntityDescriptor/md:IDPSSODescriptor/md:SingleLogoutService')
136-
)
137-
{
130+
for my $slo ($xpath->findnodes("$basepath/md:SingleLogoutService")) {
138131
my $binding = $slo->getAttribute('Binding');
139132
$data->{SLO}->{$binding} = $slo->getAttribute('Location');
140133
}
141134

142-
for my $art (
143-
$xpath->findnodes(
144-
'//md:EntityDescriptor/md:IDPSSODescriptor/md:ArtifactResolutionService')
145-
)
146-
{
135+
for my $art ($xpath->findnodes("$basepath/md:ArtifactResolutionService")) {
147136
my $binding = $art->getAttribute('Binding');
148137
$data->{Art}->{$binding} = $art->getAttribute('Location');
149138
}
150139

151-
for my $format (
152-
$xpath->findnodes('//md:EntityDescriptor/md:IDPSSODescriptor/md:NameIDFormat'))
153-
{
140+
for my $format ($xpath->findnodes("$basepath/md:NameIDFormat")) {
154141
$format = $format->string_value;
155142
$format =~ s/^\s+//g;
156143
$format =~ s/\s+$//g;
@@ -164,50 +151,26 @@ sub new_from_xml {
164151
}
165152
}
166153

167-
my @certs = ();
168-
169-
for my $key (
170-
$xpath->findnodes('//md:EntityDescriptor/md:IDPSSODescriptor/md:KeyDescriptor'))
171-
{
172-
my @uses;
173-
push (@uses, $key->getAttribute('use') || 'signing');
174-
push (@uses, 'encryption') if !$key->getAttribute('use');
175-
176-
177-
$key->setNamespace('http://www.w3.org/2000/09/xmldsig#', 'ds');
178-
179-
my ($text)
180-
= $key->findvalue("ds:KeyInfo/ds:X509Data/ds:X509Certificate", $key)
181-
=~ /^\s*(.+?)\s*$/s;
182-
183-
# rewrap the base64 data from the metadata; it may not
184-
# be wrapped at 64 characters as PEM requires
185-
$text =~ s/\n//g;
186-
187-
my @lines;
188-
while(length $text > 64) {
189-
push @lines, substr $text, 0, 64, '';
154+
my %certs = ();
155+
for my $key ($xpath->findnodes("$basepath/md:KeyDescriptor")) {
156+
my $use = $key->getAttribute('use');
157+
my $pem = $class->_get_pem_from_keynode($key);
158+
if (!$use) {
159+
push(@{$certs{signing}}, $pem);
160+
push(@{$certs{encryption}}, $pem);
190161
}
191-
push @lines, $text;
192-
193-
$text = join "\n", @lines;
194-
195-
# form a PEM certificate
196-
for my $use (@uses) {
197-
my $pem->{$use}
198-
= sprintf("-----BEGIN CERTIFICATE-----\n%s\n-----END CERTIFICATE-----\n",
199-
$text);
200-
push (@certs, $pem);
162+
else {
163+
push(@{$certs{$use}}, $pem);
201164
}
202165
}
203166

204-
my $self = $class->new(
167+
return $class->new(
205168
entityid => $xpath->findvalue('//md:EntityDescriptor/@entityID'),
206169
sso_urls => $data->{SSO},
207170
slo_urls => $data->{SLO} || {},
208171
art_urls => $data->{Art} || {},
209-
certs => \@certs,
210-
cacert => $args{cacert},
172+
certs => \%certs,
173+
cacert => $args{cacert},
211174
$data->{DefaultFormat}
212175
? (
213176
default_format => $data->{DefaultFormat},
@@ -216,9 +179,34 @@ sub new_from_xml {
216179
: (),
217180
);
218181

219-
return $self;
220182
}
221183

184+
sub _get_pem_from_keynode {
185+
my $self = shift;
186+
my $node = shift;
187+
188+
$node->setNamespace('http://www.w3.org/2000/09/xmldsig#', 'ds');
189+
190+
my ($text)
191+
= $node->findvalue("ds:KeyInfo/ds:X509Data/ds:X509Certificate", $node)
192+
=~ /^\s*(.+?)\s*$/s;
193+
194+
# rewrap the base64 data from the metadata; it may not
195+
# be wrapped at 64 characters as PEM requires
196+
$text =~ s/\n//g;
197+
198+
my @lines;
199+
while(length $text > 64) {
200+
push @lines, substr $text, 0, 64, '';
201+
}
202+
push @lines, $text;
203+
204+
$text = join "\n", @lines;
205+
206+
return "-----BEGIN CERTIFICATE-----\n$text\n-----END CERTIFICATE-----\n";
207+
}
208+
209+
222210
# BUILDARGS ( hashref of the parameters passed to the constructor )
223211
#
224212
# Called after the object is created to validate the IdP using the cacert
@@ -233,32 +221,22 @@ around BUILDARGS => sub {
233221
if ($params{cacert}) {
234222
my $ca = Crypt::OpenSSL::Verify->new($params{cacert}, { strict_certs => 0, });
235223

236-
my $verified = 0;
237-
my %errors;
238-
my %certs;
239-
240-
for my $pem (@{ $params{certs} }) {
241-
for my $use (keys %{$pem}) {
242-
my @tmpcrt;
243-
my $cert = Crypt::OpenSSL::X509->new_from_string($pem->{$use});
224+
my %certificates;
225+
for my $use (keys %{$params{certs}}) {
226+
my $certs = $params{certs}{$use};
227+
for my $pem (@{$certs}) {
228+
my $cert = Crypt::OpenSSL::X509->new_from_string($pem);
244229
## BUGBUG this is failing for valid things ...
245230
eval { $ca->verify($cert) };
246231
if ($@) {
247-
$errors{$cert->fingerprint_sha256} = $@;
232+
warn "Can't verify IdP cert: $@";
248233
next;
249234
}
250-
$verified = 1;
251-
push @tmpcrt, $pem->{$use};
252-
253-
$certs{$use} = \@tmpcrt;
235+
push(@{$certificates{$use}}, $pem);
254236
}
255237
}
256238

257-
$params{certs} = \%certs;
258-
259-
if (!$verified) {
260-
warn "Can't verify IdP signing cert: ", %errors, "\n";
261-
}
239+
$params{certs} = \%certificates;
262240
}
263241

264242
return $self->$orig(%params);

t/01-create-idp.t

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,4 +387,22 @@ XML
387387
);
388388
}
389389

390+
{
391+
my $xml = path('t/data/idp-metadata-signing-encryption.xml')->slurp;
392+
my $idp = Net::SAML2::IdP->new_from_xml(
393+
xml => $xml,
394+
);
395+
396+
isa_ok($idp, "Net::SAML2::IdP");
397+
is(@{$idp->cert('signing')}, 1, 'Got one signing cert');
398+
is(@{$idp->cert('encryption')}, 1, 'Got one encryption cert');
399+
}
400+
401+
{
402+
my $xml = path('t/data/idp-metadata-multiple-invalid-use.xml')->slurp;
403+
my $idp = Net::SAML2::IdP->new_from_xml(xml => $xml);
404+
is(@{$idp->cert('signing')}, 1, 'Got one signing cert');
405+
is(@{$idp->cert('encryption')}, 2, 'Got two encryption certs');
406+
}
407+
390408
done_testing;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://accounts.google.com/o/saml2?idpid=C01nccos6" validUntil="2022-04-20T00:56:59.000Z">
3+
<md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
4+
<md:KeyDescriptor>
5+
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
6+
<ds:X509Data>
7+
<ds:X509Certificate>MIIDdDCCAlygAwIBAgIGAVuOAyTCMA0GCSqGSIb3DQEBCwUAMHsxFDASBgNVBAoTC0dvb2dsZSBJ
8+
bmMuMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MQ8wDQYDVQQDEwZHb29nbGUxGDAWBgNVBAsTD0dv
9+
b2dsZSBGb3IgV29yazELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWEwHhcNMTcwNDIx
10+
MDA1NjU5WhcNMjIwNDIwMDA1NjU5WjB7MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEWMBQGA1UEBxMN
11+
TW91bnRhaW4gVmlldzEPMA0GA1UEAxMGR29vZ2xlMRgwFgYDVQQLEw9Hb29nbGUgRm9yIFdvcmsx
12+
CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
13+
MIIBCgKCAQEAsziYPBZSqLzs5pFfoZPTVyoHwM4fmI9qQIScWJB0435ss5HDRDKBTvO8rg2sGbfM
14+
SYVINLvesTeTNkPkMfoSplne6uWjAWkoskvls+0bzp8jAXb+UJ1cZplQxhWW25TsEcpcMX+p4J0v
15+
/syO9lyDubNSpchPGIuzitKXdwFkgcOiCFk+01MF3COKaO6HoLr5Jqf7I6qjJy72h3ZC7rGUtwjC
16+
QPaAfeLIM2uGmdOcm7Ql/89hBSjJYvJOXOyEZqppYd2tat7UPh4q8UTmPhwETaVssThfNZUpt9iZ
17+
cCFcWaVh/mljxD/V20VNMAlzN8VXM/WjbBSAePS30VRF6xXlzwIDAQABMA0GCSqGSIb3DQEBCwUA
18+
A4IBAQAKxc4M+il/bQQcmm/JNKF5ypeC0YH+oRjSwec84pznP2qqjWosR2uR9hL6CN2dOZU/uCaX
19+
1nZviGIlsw9n7JUEfxMs4azYWfdTz7C7l9x6HpF/QK5NwBe1z3iPZAiKR8hBqt7IeN3nlT4RsaMr
20+
0E9UbG5pimxEG0uves5BoHS+3Xfb8sd33dNRyCm22nb2wWGG+jTKy2G8/24gHB2c0X6/AiD3dZbY
21+
qf7pFRWrXefkMaUMaCMnQh+owjjxVNEAAQ8QU/2Hwhz6pR0eEGL6UwWufJX8uSGaxqn+397MdrI4
22+
CE0gQAZXrB1L3PU9tdyiap2hWQPo8T2STpOtvcovFPHs</ds:X509Certificate>
23+
</ds:X509Data>
24+
</ds:KeyInfo>
25+
</md:KeyDescriptor>
26+
<md:KeyDescriptor use="encryption">
27+
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
28+
<ds:X509Data>
29+
<ds:X509Certificate>MIIDdDCCAlygAwIBAgIGAWj+rlteMA0GCSqGSIb3DQEBCwUAMHsxFDASBgNVBAoTC0dvb2dsZSBJ
30+
bmMuMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MQ8wDQYDVQQDEwZHb29nbGUxGDAWBgNVBAsTD0dv
31+
b2dsZSBGb3IgV29yazELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWEwHhcNMTkwMjE4
32+
MDMzNzQ1WhcNMjQwMjE3MDMzNzQ1WjB7MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEWMBQGA1UEBxMN
33+
TW91bnRhaW4gVmlldzEPMA0GA1UEAxMGR29vZ2xlMRgwFgYDVQQLEw9Hb29nbGUgRm9yIFdvcmsx
34+
CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
35+
MIIBCgKCAQEAubE4/cl70Lc2f7VV+ZJyzYIzuAMj6ejlbtRnym2kgyYjaaO0MVU/r38oRC7UqdQI
36+
XwA0/S1Eu0k6EYcCUiyTGWz3HKv/OSOSnSDpN4wEWaZbmJYvu8SjWZQCVdcM4fx1kzrtE+LEBTOK
37+
gj0k2G1qUMNI7xaqiJONO9aIeCic5zbACNpc+IOZoRS4RaY5Ie7W1ZIXAJ0xWL3snVdqklaJzzU2
38+
Myt5QX6W1Sd411Hzo+Ihi5ksq18ML1tgMTFIqLkY2Luf5JJdZFRcCgvHrFF2CQywE0ftZtSSg5wD
39+
+hp3PJpL5bxxF1vSdyKQbUia1Buc8+Cy6NTIbmLLIrcyULyHSwIDAQABMA0GCSqGSIb3DQEBCwUA
40+
A4IBAQAXKjWrRzhgUW1+pK3V51MGl2b/yf33Ac4fm7GQql0Ag0Neye1EmdLjD2N9gVeFawMcfRT4
41+
GABBHtS5bu01M8QHHAGjbBKfqOaPJc39v0Y/RCSd/FzXg99hNT5UggAWVR+vC6a1IrVSUa5eKe82
42+
yBAubbdftvGtKHG90HIAsb1iyMKK2rGnTupgJfJIUTWhWnWuemIVwduErFCxng//jYXViyEloz73
43+
0faMIp6eNSD2+2cCssVGFb6FxhCvVuNh6tgXv4vErVSWerFk/GcIh5n/biaDy/gEtAqgK154AfOi
44+
fpDP3l3ZV/celj1wSwcLF90e84XaVIkzb3veTcWhqaaq</ds:X509Certificate>
45+
</ds:X509Data>
46+
</ds:KeyInfo>
47+
</md:KeyDescriptor>
48+
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
49+
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://accounts.google.com/o/saml2/idp?idpid=C01nccos6"/>
50+
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://accounts.google.com/o/saml2/idp?idpid=C01nccos6"/>
51+
</md:IDPSSODescriptor>
52+
</md:EntityDescriptor>
53+
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://accounts.google.com/o/saml2?idpid=C01nccos6" validUntil="2022-04-20T00:56:59.000Z">
3+
<md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
4+
<md:KeyDescriptor use="signing">
5+
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
6+
<ds:X509Data>
7+
<ds:X509Certificate>MIIDdDCCAlygAwIBAgIGAVuOAyTCMA0GCSqGSIb3DQEBCwUAMHsxFDASBgNVBAoTC0dvb2dsZSBJ
8+
bmMuMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MQ8wDQYDVQQDEwZHb29nbGUxGDAWBgNVBAsTD0dv
9+
b2dsZSBGb3IgV29yazELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWEwHhcNMTcwNDIx
10+
MDA1NjU5WhcNMjIwNDIwMDA1NjU5WjB7MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEWMBQGA1UEBxMN
11+
TW91bnRhaW4gVmlldzEPMA0GA1UEAxMGR29vZ2xlMRgwFgYDVQQLEw9Hb29nbGUgRm9yIFdvcmsx
12+
CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
13+
MIIBCgKCAQEAsziYPBZSqLzs5pFfoZPTVyoHwM4fmI9qQIScWJB0435ss5HDRDKBTvO8rg2sGbfM
14+
SYVINLvesTeTNkPkMfoSplne6uWjAWkoskvls+0bzp8jAXb+UJ1cZplQxhWW25TsEcpcMX+p4J0v
15+
/syO9lyDubNSpchPGIuzitKXdwFkgcOiCFk+01MF3COKaO6HoLr5Jqf7I6qjJy72h3ZC7rGUtwjC
16+
QPaAfeLIM2uGmdOcm7Ql/89hBSjJYvJOXOyEZqppYd2tat7UPh4q8UTmPhwETaVssThfNZUpt9iZ
17+
cCFcWaVh/mljxD/V20VNMAlzN8VXM/WjbBSAePS30VRF6xXlzwIDAQABMA0GCSqGSIb3DQEBCwUA
18+
A4IBAQAKxc4M+il/bQQcmm/JNKF5ypeC0YH+oRjSwec84pznP2qqjWosR2uR9hL6CN2dOZU/uCaX
19+
1nZviGIlsw9n7JUEfxMs4azYWfdTz7C7l9x6HpF/QK5NwBe1z3iPZAiKR8hBqt7IeN3nlT4RsaMr
20+
0E9UbG5pimxEG0uves5BoHS+3Xfb8sd33dNRyCm22nb2wWGG+jTKy2G8/24gHB2c0X6/AiD3dZbY
21+
qf7pFRWrXefkMaUMaCMnQh+owjjxVNEAAQ8QU/2Hwhz6pR0eEGL6UwWufJX8uSGaxqn+397MdrI4
22+
CE0gQAZXrB1L3PU9tdyiap2hWQPo8T2STpOtvcovFPHs</ds:X509Certificate>
23+
</ds:X509Data>
24+
</ds:KeyInfo>
25+
</md:KeyDescriptor>
26+
<md:KeyDescriptor use="encryption">
27+
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
28+
<ds:X509Data>
29+
<ds:X509Certificate>MIIDdDCCAlygAwIBAgIGAWj+rlteMA0GCSqGSIb3DQEBCwUAMHsxFDASBgNVBAoTC0dvb2dsZSBJ
30+
bmMuMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MQ8wDQYDVQQDEwZHb29nbGUxGDAWBgNVBAsTD0dv
31+
b2dsZSBGb3IgV29yazELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWEwHhcNMTkwMjE4
32+
MDMzNzQ1WhcNMjQwMjE3MDMzNzQ1WjB7MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEWMBQGA1UEBxMN
33+
TW91bnRhaW4gVmlldzEPMA0GA1UEAxMGR29vZ2xlMRgwFgYDVQQLEw9Hb29nbGUgRm9yIFdvcmsx
34+
CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
35+
MIIBCgKCAQEAubE4/cl70Lc2f7VV+ZJyzYIzuAMj6ejlbtRnym2kgyYjaaO0MVU/r38oRC7UqdQI
36+
XwA0/S1Eu0k6EYcCUiyTGWz3HKv/OSOSnSDpN4wEWaZbmJYvu8SjWZQCVdcM4fx1kzrtE+LEBTOK
37+
gj0k2G1qUMNI7xaqiJONO9aIeCic5zbACNpc+IOZoRS4RaY5Ie7W1ZIXAJ0xWL3snVdqklaJzzU2
38+
Myt5QX6W1Sd411Hzo+Ihi5ksq18ML1tgMTFIqLkY2Luf5JJdZFRcCgvHrFF2CQywE0ftZtSSg5wD
39+
+hp3PJpL5bxxF1vSdyKQbUia1Buc8+Cy6NTIbmLLIrcyULyHSwIDAQABMA0GCSqGSIb3DQEBCwUA
40+
A4IBAQAXKjWrRzhgUW1+pK3V51MGl2b/yf33Ac4fm7GQql0Ag0Neye1EmdLjD2N9gVeFawMcfRT4
41+
GABBHtS5bu01M8QHHAGjbBKfqOaPJc39v0Y/RCSd/FzXg99hNT5UggAWVR+vC6a1IrVSUa5eKe82
42+
yBAubbdftvGtKHG90HIAsb1iyMKK2rGnTupgJfJIUTWhWnWuemIVwduErFCxng//jYXViyEloz73
43+
0faMIp6eNSD2+2cCssVGFb6FxhCvVuNh6tgXv4vErVSWerFk/GcIh5n/biaDy/gEtAqgK154AfOi
44+
fpDP3l3ZV/celj1wSwcLF90e84XaVIkzb3veTcWhqaaq</ds:X509Certificate>
45+
</ds:X509Data>
46+
</ds:KeyInfo>
47+
</md:KeyDescriptor>
48+
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
49+
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://accounts.google.com/o/saml2/idp?idpid=C01nccos6"/>
50+
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://accounts.google.com/o/saml2/idp?idpid=C01nccos6"/>
51+
</md:IDPSSODescriptor>
52+
</md:EntityDescriptor>
53+

0 commit comments

Comments
 (0)