sources/saml: entity_id -> issuer

This commit is contained in:
Jens Langhammer 2020-02-20 17:23:27 +01:00
parent 0b5caa85f5
commit 84fc54ddaa
5 changed files with 44 additions and 13 deletions

View File

@ -0,0 +1,26 @@
# Generated by Django 3.0.3 on 2020-02-20 16:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("passbook_sources_saml", "0004_auto_20200217_1526"),
]
operations = [
migrations.RenameField(
model_name="samlsource", old_name="entity_id", new_name="issuer",
),
migrations.AlterField(
model_name="samlsource",
name="issuer",
field=models.TextField(
blank=True,
default=None,
help_text="Also known as Entity ID. Defaults the Metadata URL.",
verbose_name="Issuer",
),
),
]

View File

@ -3,14 +3,19 @@ from django.db import models
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from passbook.core.types import UILoginButton
from passbook.core.models import Source from passbook.core.models import Source
from passbook.core.types import UILoginButton
class SAMLSource(Source): class SAMLSource(Source):
"""SAML Source""" """SAML Source"""
entity_id = models.TextField(blank=True, default=None, verbose_name=_("Entity ID")) issuer = models.TextField(
blank=True,
default=None,
verbose_name=_("Issuer"),
help_text=_("Also known as Entity ID. Defaults the Metadata URL."),
)
idp_url = models.URLField(verbose_name=_("IDP URL")) idp_url = models.URLField(verbose_name=_("IDP URL"))
idp_logout_url = models.URLField( idp_logout_url = models.URLField(

View File

@ -1,6 +1,6 @@
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="{{ entity_id }}"> xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="{{ issuer }}">
<md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:KeyDescriptor use="signing"> <md:KeyDescriptor use="signing">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">

View File

@ -6,12 +6,12 @@ from passbook.core.models import User
from passbook.sources.saml.models import SAMLSource from passbook.sources.saml.models import SAMLSource
def get_entity_id(request: HttpRequest, source: SAMLSource): def get_issuer(request: HttpRequest, source: SAMLSource) -> str:
"""Get Source's entity ID, falling back to our Metadata URL if none is set""" """Get Source's Issuer, falling back to our Metadata URL if none is set"""
entity_id = source.entity_id issuer = source.issuer
if entity_id is None: if issuer is None:
return build_full_url("metadata", request, source) return build_full_url("metadata", request, source)
return entity_id return issuer
def build_full_url(view: str, request: HttpRequest, source: SAMLSource) -> str: def build_full_url(view: str, request: HttpRequest, source: SAMLSource) -> str:

View File

@ -17,7 +17,7 @@ from passbook.sources.saml.models import SAMLSource
from passbook.sources.saml.utils import ( from passbook.sources.saml.utils import (
_get_user_from_response, _get_user_from_response,
build_full_url, build_full_url,
get_entity_id, get_issuer,
) )
from passbook.sources.saml.xml_render import get_authnrequest_xml from passbook.sources.saml.xml_render import get_authnrequest_xml
@ -37,7 +37,7 @@ class InitiateView(View):
"DESTINATION": source.idp_url, "DESTINATION": source.idp_url,
"AUTHN_REQUEST_ID": get_random_id(), "AUTHN_REQUEST_ID": get_random_id(),
"ISSUE_INSTANT": get_time_string(), "ISSUE_INSTANT": get_time_string(),
"ISSUER": get_entity_id(request, source), "ISSUER": get_issuer(request, source),
} }
authn_req = get_authnrequest_xml(parameters, signed=False) authn_req = get_authnrequest_xml(parameters, signed=False)
_request = nice64(str.encode(authn_req)) _request = nice64(str.encode(authn_req))
@ -97,16 +97,16 @@ class MetadataView(View):
def dispatch(self, request: HttpRequest, source_slug: str) -> HttpResponse: def dispatch(self, request: HttpRequest, source_slug: str) -> HttpResponse:
"""Replies with the XML Metadata SPSSODescriptor.""" """Replies with the XML Metadata SPSSODescriptor."""
source: SAMLSource = get_object_or_404(SAMLSource, slug=source_slug) source: SAMLSource = get_object_or_404(SAMLSource, slug=source_slug)
entity_id = get_entity_id(request, source) issuer = get_issuer(request, source)
cert_stripped = strip_pem_header(source.signing_cert.replace("\r", "")).replace( cert_stripped = strip_pem_header(source.signing_cert.replace("\r", "")).replace(
"\n", "" "\n", ""
) )
return render_xml( return render_xml(
request, request,
"saml/sp/xml/spssodescriptor.xml", "saml/sp/xml/sp_sso_descriptor.xml",
{ {
"acs_url": build_full_url("acs", request, source), "acs_url": build_full_url("acs", request, source),
"entity_id": entity_id, "issuer": issuer,
"cert_public_key": cert_stripped, "cert_public_key": cert_stripped,
}, },
) )