Changeset 5227 for TI12-security


Ignore:
Timestamp:
27/04/09 16:08:37 (10 years ago)
Author:
pjkersha
Message:

1.0.1 rc2

Added capability for Policy Information Point to query an Attribute Authority directly without a remote Session Manager intermediary to cache credentials. This is the use case for ESG based IdP connecting to NDG services.

Location:
TI12-security/trunk/python
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.client/setup.cfg

    r5223 r5227  
    1717 
    1818[egg_info] 
    19 tag_build = rc1 
     19tag_build = rc2 
    2020tag_svn_revision = true 
    2121 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/authz/msi.py

    r5187 r5227  
    162162        self.status = status 
    163163        self.message = message 
    164          
    165          
     164  
     165         
     166from ndg.security.common.AttCert import AttCertInvalidSignature, \ 
     167    AttCertNotBeforeTimeError, AttCertExpired, AttCertError  
     168       
    166169from ndg.security.common.sessionmanager import SessionManagerClient, \ 
    167170    SessionNotFound, SessionCertTimeError, SessionExpired, InvalidSession, \ 
    168171    AttributeRequestDenied 
    169                      
     172 
     173from ndg.security.common.attributeauthority import AttributeAuthorityClient, \ 
     174    NoTrustedHosts, NoMatchingRoleInTrustedHosts, \ 
     175    InvalidAttributeAuthorityClientCtx 
     176from ndg.security.common.attributeauthority import AttributeRequestDenied as \ 
     177    AA_AttributeRequestDenied 
     178                    
    170179from ndg.security.common.authz.pdp import PDPUserNotLoggedIn, \ 
    171180    PDPUserAccessDenied 
     
    274283        self.caCertFilePathList = cfg.get(prefix + 'caCertFilePathList', []) 
    275284 
     285 
    276286    def attributeQuery(self, attributeQuery): 
    277287        """Query the Attribute Authority specified in the request to retrieve 
     
    285295         
    286296        subject = attributeQuery[PIPAttributeQuery.SUBJECT_NS] 
     297        username = subject[Subject.USERID_NS] 
    287298        sessionId = subject[Subject.SESSIONID_NS] 
    288299        attributeAuthorityURI = attributeQuery[ 
     
    291302        sessionId = subject[Subject.SESSIONID_NS] 
    292303        attributeCertificate = self._getAttributeCertificate( 
     304                                        attributeAuthorityURI, 
     305                                        username, 
    293306                                        sessionId, 
    294                                         subject[Subject.SESSIONMANAGERURI_NS], 
    295                                         attributeAuthorityURI) 
     307                                        subject[Subject.SESSIONMANAGERURI_NS]) 
    296308 
    297309        attributeResponse = PIPAttributeResponse() 
     
    302314     
    303315    def _getAttributeCertificate(self, 
    304                                  sessionId, 
    305                                  sessionManagerURI, 
    306                                  attributeAuthorityURI): 
     316                                 attributeAuthorityURI, 
     317                                 username=None, 
     318                                 sessionId=None, 
     319                                 sessionManagerURI=None): 
     320        '''Retrieve an Attribute Certificate 
     321 
     322        @type attributeAuthorityURI: basestring 
     323        @param attributeAuthorityURI: URI to Attribute Authority service 
     324        @type username: basestring 
     325        @param username: subject user identifier - could be an OpenID         
     326        @type sessionId: basestring 
     327        @param sessionId: Session Manager session handle 
     328        @type sessionManagerURI: basestring 
     329        @param sessionManagerURI: URI to remote session manager service 
     330        @rtype: ndg.security.common.AttCert.AttCert 
     331        @return: Attribute Certificate containing user roles 
     332        ''' 
     333 
     334        if False and sessionId and sessionManagerURI: 
     335            attrCert = self._getAttributeCertificateFromSessionManager( 
     336                                                     attributeAuthorityURI, 
     337                                                     sessionId, 
     338                                                     sessionManagerURI) 
     339        else: 
     340            return self._getAttributeCertificateFromAttributeAuthority( 
     341                                                     attributeAuthorityURI, 
     342                                                     username) 
     343         
     344        try: 
     345            attrCert.certFilePathList = self.caCertFilePathList 
     346            attrCert.isValid(raiseExcep=True) 
     347         
     348        except AttCertInvalidSignature, e: 
     349            log.exception(e) 
     350            raise AttributeCertificateInvalidSignature() 
     351         
     352        except AttCertNotBeforeTimeError, e:    
     353            log.exception(e) 
     354            raise AttributeCertificateNotBeforeTimeError() 
     355         
     356        except AttCertExpired, e:    
     357            log.exception(e) 
     358            raise AttributeCertificateExpired() 
     359 
     360        except AttCertError, e: 
     361            log.exception(e) 
     362            raise InvalidAttributeCertificate() 
     363     
     364             
     365    def _getAttributeCertificateFromSessionManager(self, 
     366                                                   attributeAuthorityURI, 
     367                                                   sessionId, 
     368                                                   sessionManagerURI): 
    307369        '''Retrieve an Attribute Certificate using the subject's Session 
    308370        Manager 
     
    314376        @type attributeAuthorityURI: basestring 
    315377        @param attributeAuthorityURI: URI to Attribute Authority service 
     378        @rtype: ndg.security.common.AttCert.AttCert 
     379        @return: Attribute Certificate containing user roles 
    316380        ''' 
    317381         
     
    331395        try: 
    332396            # Make request for attribute certificate 
    333             attCert = smClnt.getAttCert( 
     397            return smClnt.getAttCert( 
    334398                                attributeAuthorityURI=attributeAuthorityURI, 
    335399                                sessID=sessionId) 
     
    362426                       e.__class__, e)) 
    363427            raise AttributeCertificateRequestError() 
     428 
     429             
     430    def _getAttributeCertificateFromAttributeAuthority(self, 
     431                                                   attributeAuthorityURI, 
     432                                                   username): 
     433        '''Retrieve an Attribute Certificate direct from an Attribute 
     434        Authority.  This method is invoked if no session ID or Session  
     435        MAnager endpoint where provided 
     436         
     437        @type username: basestring 
     438        @param username: user identifier - may be an OpenID URI 
     439        @type attributeAuthorityURI: basestring 
     440        @param attributeAuthorityURI: URI to Attribute Authority service 
     441        @rtype: ndg.security.common.AttCert.AttCert 
     442        @return: Attribute Certificate containing user roles 
     443        ''' 
    364444         
    365445        try: 
    366             attCert.certFilePathList = self.caCertFilePathList 
    367             attCert.isValid(raiseExcep=True) 
    368          
    369         except AttCertInvalidSignature, e: 
    370             log.exception(e) 
    371             raise AttributeCertificateInvalidSignature() 
    372          
    373         except AttCertNotBeforeTimeError, e:    
    374             log.exception(e) 
    375             raise AttributeCertificateNotBeforeTimeError() 
    376          
    377         except AttCertExpired, e:    
    378             log.exception(e) 
    379             raise AttributeCertificateExpired() 
    380  
    381         except AttCertError, e: 
    382             log.exception(e) 
    383             raise InvalidAttributeCertificate() 
    384              
    385         return attCert 
     446            # Create Attribute Authority client - if a file path was set,  
     447            # settingare read  from a separate config file section otherwise,  
     448            # from the PDP config object 
     449            aaClnt = AttributeAuthorityClient( 
     450                            uri=attributeAuthorityURI, 
     451                            sslCACertFilePathList=self.sslCACertFilePathList, 
     452                            cfg=self.wssecurityCfg) 
     453        except Exception, e: 
     454            log.error("Creating Attribute Authority client: %s" % e) 
     455            raise InitSessionCtxError() 
     456         
     457          
     458        try: 
     459            # Make request for attribute certificate 
     460            attrCert = aaClnt.getAttCert(userId=username) 
     461         
     462         
     463        except AA_AttributeRequestDenied, e: 
     464            log.error("Request for attribute certificate denied: %s" % e) 
     465            raise PDPUserAccessDenied() 
     466         
     467        # TODO: handle othe specific Exception types here for more fine 
     468        # grained response info 
     469 
     470        except Exception, e: 
     471            log.error("Request to Attribute Authority [%s] for attribute " 
     472                      "certificate: %s: %s", attributeAuthorityURI, 
     473                       e.__class__, e) 
     474            raise AttributeCertificateRequestError() 
     475 
     476        return attrCert 
    386477 
    387478            
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/utils/classfactory.py

    r5148 r5227  
    4141 
    4242    importedClass = getattr(module, className) 
     43     
     44    log.info('Imported "%s" class from module, "%s"', className, moduleName) 
    4345    return importedClass 
    4446     
     
    5052    @param moduleName: Name of module containing the class 
    5153    @type moduleName: str  
    52     @param className: Name of the class to instantiate 
     54    @param className: Name of the class to instantiate.  May be None in  
     55    which case, the class name is parsed from the moduleName last element 
    5356    @type className: str 
    5457    @keyword moduleFilePath: Path to the module - if unset, assume module on  
     
    114117            object = importedClass(**classProperties) 
    115118             
    116         log.info('Instantiated "%s" class from module, "%s"' % (className, 
    117                                                                 moduleName)) 
    118119        return object 
    119120 
  • TI12-security/trunk/python/ndg.security.common/setup.cfg

    r5223 r5227  
    1717 
    1818[egg_info] 
    19 tag_build = rc1 
     19tag_build = rc2 
    2020tag_svn_revision = true 
    2121 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/authn.py

    r5224 r5227  
    154154            return True 
    155155        else: 
    156             log.debug("%s.checker skipping status %s", cls.__name__, status) 
     156            log.debug("%s.checker skipping status [%s]", cls.__name__, status) 
    157157            return False 
    158158 
     
    182182         
    183183        if self.signoutPath and self.pathInfo == self.signoutPath: 
     184            log.debug("SessionHandlerMiddleware: caught signout path [%s]", 
     185                      self.signoutPath) 
     186             
    184187            referer = session.get(self.__class__.logoutReturn2URIArgName) 
    185188            if referer is not None: 
     
    200203            session.save() 
    201204        else: 
     205            log.debug("SessionHandlerMiddleware: checking for REMOTE_* " 
     206                      "environment variable settings set by OpenID Relying " 
     207                      "Party signin...") 
     208             
    202209            if 'username' not in session and 'REMOTE_USER' in environ: 
     210                log.debug("SessionHandlerMiddleware: updating session with " 
     211                          "username=%s", environ['REMOTE_USER']) 
     212                 
    203213                session['username'] = environ['REMOTE_USER'] 
    204214                 
    205215            if environ.get('REMOTE_USER_DATA', ''): 
     216                log.debug("SessionHandlerMiddleware: found REMOTE_USER_DATA=" 
     217                          "%s, set from OpenID Relying Party signin") 
     218                 
    206219                # eval is safe here because AuthKit cookie is signed and  
    207220                # AuthKit middleware checks for tampering 
     
    214227                    sessionId = axData['ax']['value.sessionId.1'] 
    215228                    session['sessionId'] = sessionId 
     229 
     230                    log.debug("SessionHandlerMiddleware: updated session " 
     231                              "with sessionManagerURI=%s and sessionId=%s",  
     232                              sessionManagerURI, sessionId) 
    216233                     
    217234                # Reset cookie removing user data 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/authz/__init__.py

    r5224 r5227  
    140140        request = Request() 
    141141        request.subject[Subject.USERID_NS] = session['username'] 
     142         
     143        # The following won't be set if the IdP running the OpenID Provider 
     144        # hasn't also deployed a Session Manager.  In this case, the 
     145        # Attribute Authority will be queried directly from here without a 
     146        # remote Session Manager intermediary to cache credentials 
    142147        request.subject[Subject.SESSIONID_NS] = session.get('sessionId') 
    143148        request.subject[Subject.SESSIONMANAGERURI_NS] = session.get( 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid/provider/authninterface/sessionmanager.py

    r5189 r5227  
    7575        @param password: corresponding password for username givens 
    7676         
    77         @raise AuthNInterfaceUsername2IdentifierMismatch: no OpenID identifiers 
    78         match the given username 
     77        @raise AuthNInterfaceUsername2IdentifierMismatch: no OpenID  
     78        identifiers match the given username 
    7979        @raise AuthNInterfaceInvalidCredentials: invalid username/password 
    8080        """ 
     
    9696                    result = connection.execute(query) 
    9797                except Exception, e: 
    98                     log.error('Connecting database for user logon query : %s' % 
     98                    log.error('Connecting database for user logon query : %s'% 
    9999                              e) 
    100100                    raise 
  • TI12-security/trunk/python/ndg.security.server/setup.cfg

    r5223 r5227  
    1616 
    1717[egg_info] 
    18 tag_build = rc1 
     18tag_build = rc2 
    1919tag_svn_revision = true 
    2020 
  • TI12-security/trunk/python/ndg.security.test/setup.cfg

    r5223 r5227  
    1010# version 1.0 or later. 
    1111[egg_info] 
    12 tag_build = rc1 
     12tag_build = rc2 
    1313tag_svn_revision = true 
    1414 
  • TI12-security/trunk/python/ndg.security/setup.cfg

    r5223 r5227  
    1919 
    2020[egg_info] 
    21 tag_build = rc1 
     21tag_build = rc2 
    2222tag_svn_revision = true 
    2323 
Note: See TracChangeset for help on using the changeset viewer.