基于pyxb的saml2支持

dm.saml2的Python项目详细描述


此包基于pyxb为saml2提供支持。

pyxbhttp://pypi.python.org/pypi/PyXB)生成一个python类 用于XML架构的集合,并提供在 关联的Python实例和xml文档它用于生成 并解析saml2消息。

该包增加了对数字签名和saml2绑定的支持,并且 元数据管理

依赖关系

PyxB

此包的版本已使用pyxb的1.1.4版进行了测试。 它可能不适用于其他版本。

pyxb生成的类集合往往非常依赖于版本。 因此,它们通常必须在pyxb版本更改时重新生成。

当前包的版本主要使用 pyxbwssplatsaml20束。因此,他们 很有机会与pyxb一起更新。 但是,pyxbsaml2包缺少对 所谓的saml2上下文类。此包包含 用pyxb==1.1.4生成的类集合。他们需要 如果pyxb版本更改(并且您使用这些类- 这不太可能)。 子包中的gen.sh脚本pyxb 可以提供如何再生它们的线索。

^{tt16}中的错误$ (http://sourceforge.net/apps/trac/pyxb/ticket/130#comment:4) 通过包管理器阻止其安装(例如 easy_installpipzc.buildout)对于Python版本 没有os.path.relpath(这适用于Python 2.4)。 我通过下载pyxb源代码来解决这个问题, 应用修补程序http://sourceforge.net/apps/trac/pyxb/attachment/ticket/130/pyxb_setup.patch 到它,然后鸡蛋安装结果。 在此之后,dm.saml2可以正常安装。

dm.xmlsec.绑定

如果遇到相关的安装问题,请查看其安装说明

示例

本节提供了一个关于如何创建、签名和 使用此包验证断言。

始终确保xmlsec库已初始化。否则,它会签署/ 签名验证可能会因可疑消息而失败。

>>> import dm.xmlsec.binding as xmlsec
>>> xmlsec.initialize()

我们现在将断言构建为python对象。

>>> import pyxb.binding.datatypes as xs
>>> from dm.saml2.pyxb.assertion import (NameID, Assertion, Subject, \
...      AuthnStatement, AttributeStatement, AuthnContext, AuthnContextClassRef, \
...      Attribute, AttributeValue, \
...      CreateFromDocument
...                                      )
>>> from datetime import datetime
>>>
>>> issuer = NameID('http://bfd.de')
>>> ass = Assertion(issuer)
>>>
>>> subject = Subject(NameID('Dieter Maurer'))
>>>
>>> ass.Subject = subject
>>>
>>> authn = AuthnStatement(
...   None,
...   AuthnContext(AuthnContextClassRef('urn:oasis:names:tc:SAML2:2.0:ac:classes:Password')),
...   AuthnInstant=datetime.utcnow(),
...   )
>>>
>>> ass.AuthnStatement.append(authn)
>>>
>>> att = AttributeStatement(
...   # does not yet work perfectly -- needs further analysis
...   Attribute(xs.string('Dieter', _element=AttributeValue), Name='Firstname'),
...   Attribute(xs.string('Maurer', _element=AttributeValue), Name='Lastname'),
...   )
>>>
>>> ass.AttributeStatement.append(att)

现在看起来是这样(还没有签名)。

>>> unsigned_ass = ass.toxml()
>>> print unsigned_ass
<?xml version="1.0" ?><ns1:Assertion ID="_fb6dc6ac-9ee6-4a1f-8010-6dba6e0d9746" IssueInstant="2012-07-06T07:24:53.262859" Version="2.0" xmlns:ns1="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:ns2="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><ns1:Issuer>http://bfd.de</ns1:Issuer><ns1:Subject><ns1:NameID>Dieter Maurer</ns1:NameID></ns1:Subject><ns1:AuthnStatement AuthnInstant="2012-07-06T07:24:53.282142"><ns1:AuthnContext><ns1:AuthnContextClassRef>urn:oasis:names:tc:SAML2:2.0:ac:classes:Password</ns1:AuthnContextClassRef></ns1:AuthnContext></ns1:AuthnStatement><ns1:AttributeStatement><ns1:Attribute Name="Firstname"><ns1:AttributeValue xsi:type="ns2:string">Dieter</ns1:AttributeValue></ns1:Attribute><ns1:Attribute Name="Lastname"><ns1:AttributeValue xsi:type="ns2:string">Maurer</ns1:AttributeValue></ns1:Attribute></ns1:AttributeStatement></ns1:Assertion>

我们定义签名上下文来支持签名。

>>> from dm.saml2.signature import default_sign_context
>>> default_sign_context.add_key(xmlsec.Key.load('key.pem',  xmlsec.KeyDataFormatPem, None), issuer.value())

我们请求ass在序列化、序列化和 看看结果

>>> ass.request_signature()
>>> signed = ass.toxml()
>>> print signed
<?xml version="1.0" ?><ns1:Assertion ID="_fb6dc6ac-9ee6-4a1f-8010-6dba6e0d9746" IssueInstant="2012-07-06T07:24:53.262859" Version="2.0" xmlns:ns1="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns:ns3="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><ns1:Issuer>http://bfd.de</ns1:Issuer><ns2:Signature><ns2:SignedInfo><ns2:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><ns2:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><ns2:Reference URI="#_fb6dc6ac-9ee6-4a1f-8010-6dba6e0d9746"><ns2:Transforms><ns2:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ns2:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ns2:Transforms><ns2:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ns2:DigestValue>6P0dLnMLJCe22YuRD1Mngiprz6k=</ns2:DigestValue></ns2:Reference></ns2:SignedInfo><ns2:SignatureValue>liaBBIVjk73x5spJrvfYg1Sa3VGnOqz0zqDKQr7qoLNg5/pzZ8llQEXQsbvw6zLh
26UnQ6D3KWvvabw9vpRqzLA21ykNUPqEGtZPMiQynvpdRSeTbg5ZyVBGYCL7ww19
MiEKryDwPI56I/3z4Le7KFZ4qpPPUptodQ4mm1PVsyA=</ns2:SignatureValue></ns2:Signature><ns1:Subject><ns1:NameID>Dieter Maurer</ns1:NameID></ns1:Subject><ns1:AuthnStatement AuthnInstant="2012-07-06T07:24:53.282142"><ns1:AuthnContext><ns1:AuthnContextClassRef>urn:oasis:names:tc:SAML2:2.0:ac:classes:Password</ns1:AuthnContextClassRef></ns1:AuthnContext></ns1:AuthnStatement><ns1:AttributeStatement><ns1:Attribute Name="Firstname"><ns1:AttributeValue xsi:type="ns3:string">Dieter</ns1:AttributeValue></ns1:Attribute><ns1:Attribute Name="Lastname"><ns1:AttributeValue xsi:type="ns3:string">Maurer</ns1:AttributeValue></ns1:Attribute></ns1:AttributeStatement></ns1:Assertion>

现在,我们来看看如何进行验证。我们首先建立 验证上下文。

>>> from dm.saml2.signature import default_verify_context
>>> default_verify_context.add_key(xmlsec.Key.load('pubkey.pem',  xmlsec.KeyDataFormatPem, None), issuer.value())

调用CreateFromDocument将验证任何(可用的)签名并引发 验证失败时的异常。验证总是使用 从验证上下文中选择密钥的Issuer。 检查签名 已在实例中验证,可以调用verified_signature

>>> verified_ass = CreateFromDocument(signed)
>>> verified_ass.verified_signature()
True

您可以使用pydoc,Python内置的help,或者查看源代码 了解更多关于这个包裹的信息。

配置

从3.1版开始,该包提供了 配置签名生成和验证过程的部分。 当saml合作伙伴实体有特殊的 这方面的要求。

您可以通过导入模块来完成这种配置 dm.saml2.config并重写其中定义的一些变量。

作为一个例子,让我们假设您的一个saml2伙伴实体 使用DsaSha1作为签名方法(而不是默认方法 RsaSha1)如果没有特殊配置,验证将失败。 xmlsec堆栈跟踪将为 禁用的转换获取这些saml2消息的配置 验证可能看起来像:

>>> from dm.saml2 import config
>>> from dm.xmlsec.binding import TransformDsaSha1
>>> config.signature_transforms += (TransformDsaSha1, )

此配置告诉包DsaSha1是 可接受的签名方法。

配置应该在第一个签名之前发生一次 创建/验证。

注释

请注意,签名的创建和验证将失败,因为 错误消息来自xmlsecxmlsec不正确时 已初始化。别忘了给dm.xmlsec.binding.initialize()打电话。

历史

3.2款

Python 3 compatibity

Added test suite

Fixes in the httpartifact binding.

3.1.3

Added a 10 s timeout in ^{tt38}$. It can be changed by changing the variable ^{tt39}$ in module ^{tt40}$.

3.1.2

Support (limited) type conversion in ^{tt41}$.

3.1.1

Adapt to the changed binding for “plural” elements (^{tt42}$ > 1) in newer ^{tt43}$ versions.

3.1

Elementary configuration support for the signature generation/verification process.

Support for use of ^{tt44}$ and ^{tt45}$ as digest or signature method, respcectively.

3.0

Switch to ^{tt46}$ values explicitely in the UTC time zone (rather than naive ^{tt46}$ values which implicitely use the UTC time zone).

This also affects the lexical representation of SAML time values: they now use the ^{tt48}$ timezone suffix.

2.1

Signature support for the HTTP redirect binding. Note: for this to work, you need at least version 1.3 of ^{tt49}$ which requires ^{tt50}$; as Plone 4.x still uses ^{tt51}$, this version dependency is not declared in ^{tt52}$.

2.0

Version 2.0 uses ^{tt49}$ as Python binding to the XML security library, rather then the no longer maintained ^{tt54}$. This drastically facilitates installation.

1.0

Initial release based on ^{tt54}$.

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用唯一的按钮标签单击按钮   代码生成如何使用Java codeModel为数组的特定索引赋值   java如何批量执行Camel SQL插入   java iText 7将ltv添加到现有签名   内存管理Java应用程序突然停止几天后(810)   带MySQL的java注册表单JavaFX在intellij中失败   如何使用eclipse为windows azure java项目启用远程调试   一种通用的java输入输出设计模式   java Android XML(RSS)忽略引号(“”)   java帮助:安卓中的8 X 10 2维按钮数组   java启动Android项目   JWrapper构建java应用程序   java如何在Android应用程序中设置基于日期/时间的默认页面加载?   java循环程序在完成后返回到起点   java Hibernate:更好的整体类还是多类映射?   回溯数独解算器的递归问题[Java]   java查找类用法   java如何在SpringWebFlow中将多个模型绑定到一个视图?