I don't get it @pedroigor. If SaleAgent IS an Agent like User IS an Agent for example. Why PicketLink can't understand it?

That would break our simple abstraction to login for example, which accepts an Agent. 

 public boolean login(Agent user, String password) {

        credentials.setUserId(user.getLoginName());
        credentials.setCredential(new Password(password));

        credentialMatcher.validate(user, password);

        if (credentialMatcher.hasExpired()) {
            throw new AeroGearSecurityException(HttpStatus.CREDENTIAL_HAS_EXPIRED);
        } else if (identity.login() != Identity.AuthenticationResult.SUCCESS) {
            throw new AeroGearSecurityException(HttpStatus.AUTHENTICATION_FAILED);
        }

        return true;
    }