'Deal with an AuthnResponse
:param xmlstr: The reply as a xml string
:param binding: Which binding that was used for the transport
:param outstanding: A dictionary with session IDs as keys and
the original web request from the user before redirection
as values.
:return: An response.AuthnResponse or None'

def parse_authn_request_response(self, xmlstr, binding, outstanding=None, outstanding_certs=None):

    try:
        _ = self.config.entityid
    except KeyError:
        raise SAMLError('Missing    entity_id    specification')
    resp = None
    if xmlstr:
        kwargs = {'outstanding_queries': outstanding, 'outstanding_certs': outstanding_certs, 'allow_unsolicited': self.allow_unsolicited, 'want_assertions_signed': self.want_assertions_signed, 'want_response_signed': self.want_response_signed, 'return_addrs': self.service_urls(binding=binding), 'entity_id': self.config.entityid, 'attribute_converters': self.config.attribute_converters, 'allow_unknown_attributes': self.config.allow_unknown_attributes}
        try:
            resp = self._parse_response(xmlstr, AuthnResponse, 'assertion_consumer_service', binding, **kwargs)
        except StatusError as err:
            logger.error(('SAML    status    error:    %s' % err))
            raise
        except UnravelError:
            return None
        except Exception as err:
            logger.error(('XML    parse    error:    %s' % err))
            raise
        if (resp is None):
            return None
        elif isinstance(resp, AuthnResponse):
            self.users.add_information_about_person(resp.session_info())
            logger.info('---    ADDED    person    info    ----')
            pass
        else:
            logger.error(('Response    type    not    supported:    %s' % (saml2.class_name(resp),)))
    return resp
