Identity Broker Forum

Welcome to the community forum for Identity Broker.

Browse the knowledge base, ask questions directly to the product group, or leverage the community to get answers. Leave ideas for new features and vote for the features or bug fixes you want most.

0
Declined

Web Services Connector

Matthew Davis (Technical Product Manager) 6 years ago updated 4 years ago 4

A web services connector may be something worth adding, if possible.

Ideally, it would have the option to take a service contract from a swagger document, WSDL file (either SOAP or WCF) and hard-mapped REST endpoints.


It would be fairly complex, as there would need to be some form of data object mapping (mainly for WCF and SOAP) and also argument mapping for calling methods that require specific object instances (like for import and export methods). 

An option would be to enable raw c# input that does the object creation and mapping from schema object to data object (similar to how the powershell connector works) but with the base connector still responsible for the importing and parsing of the service contract.

Technically this could be achieved already with the existing powershell connector, however in its current usage it is not a repeatable or clean solution. May be worth seeing if improvements can be made to the powershell connector to support this use case. 

Answer

Should be covered by a simpler connector integration framework.

0
Answered

Dumping Adapter Data

Daniel Walters 6 years ago updated by anonymous 6 years ago 5

What would be the quickest way to dump the data in an adapter so I can compare two adapters? The use case is the replacement of an adapter and the new adapter should be a like-for-like replacement of the original with the same resulting data as a the old one. Would it be a PowerShell script that pulls the adapter via the ldap gateway?

Answer

Hey Daniel,

That's correct. The quickest and most supported way is to query the LDAP gateway for the adapter you're needing the data from.

0
Answered

Reverse Join, Conditional on Not-Null

Daniel Walters 6 years ago updated by anonymous 6 years ago 2

Related to my ticket Join Condition on Not-Null, I need some processing on the connector side of the adapter to correctly join.

I want to join the position table back to the person table to resolve a positionReportsToPosition attribute to a personnumber but the person table contains two attributes with position numbers. One has a value or is null, the other always has a value. I want to use the first if it has a value, otherwise the second. Since I can't join adapters, there's nowhere to process this logic on the employee side.

Do I need to implement a PowerShell connector that queries the IdB DB like Carols script for flattening Org Units. It could just contain the employeeID and the calculated positionnumber.

Answer

Hey Daniel,

Querying the IdB DB is not a supported or endorsed operation. Doing this is at your own risk and has the potential to cause problems. 

From what I understand, you're trying to get the person number of the manager based on someones position. Is that correct?
If so, as discussed in your other ticket we already have a join to that persons position. Using that join, we can get the positionReportsToPosition as you've mentioned above. You can then use that to join back to the employee connector onto one of the position fields. Tell it to pull back the person number into a new field, such as reportsPersonTemp Then add a second join again to the employee connector, but on the position field that's always full. Push this into a field such as reportsPersonPerm. You can then use a powershell transformation to determine which value to use - if the reportsPersonTemp is populated, then push that value into reportsPersonNumber. Otherwise, use the value from reportsPersonPerm

When you configure a join, if there's no value to join on then the field won't be populated, so you'll be able to easily tell which value to use.

0
Answered

Join Conditional on Not-Null

Daniel Walters 6 years ago updated by Matthew Davis (Technical Product Manager) 6 years ago 1

I've had a look at the Join transformation and I don't think this functionality is there but is it possible to join one attribute if it has a value, otherwise join on another? Could this be achieved with a PowerShell transformation that populates a third attribute that does the non-null populating then join on that third attribute?

The object model that I've got this situation for is an Employee table and a Position table. The Employee table contains two attributes placePosition(contains the position number of the position someone is acting in, otherwise is null) and actPosition(contains the persons 'actual' position number, always has a value). I want to join Employee to Position on placePosition if it has a value, otherwise join to position on actPosition. Is the way to do this with a PowerShell transformation that calculates out the null to a third attribute, CurrentPosition or something, and then join on that.?

Answer

Hey Dan,

You're right - the powershell transformation mixed with a join transformation would be the best way to do this.

You would put the powershell transformation first, and have populate a third attribute called something like calculatedPosition. You'd use the logic as above - put the placePosition if it's populated, otherwise use actPosition

Then you would add a join transformation, and join to the position connector using the calculatedPosition field. That way you're always going to join on the value that the powershell transformation populates.

0
Under review

Usability Improvement Rename Transformation

Daniel Walters 6 years ago updated by Matthew Davis (Technical Product Manager) 3 weeks ago 4

Two things,

there doesn't seem to be a need for IdB to add the text in the right hand column of the rename transformation after the attribute is selected in the left hand column. It jilts and takes a second to populate after the attribute has been selected from the drop down on the left. It'd be nicer if it just left the right column blank since the point of it is to rename the attribute, there's no need to get the old name pre-populated in the right side column field.

Can the tab order or something be changed so that when you press enter it clicks the add button (or does nothing). It's a bit of a data entry task adding the renames so hitting enter is natural and at the moment pressing enter clicks the Save Transformation button which clears any renames you've entered and haven't committed yet.

0
Declined

Staging error on MA because MIM is trying to import the same changes twice

Tom Parker 6 years ago updated by Matthew Davis (Technical Product Manager) 6 years ago 3

We are seeing occasional (approx 1 per month) incidents of staging errors in a specific MA in MIM targeting UNIFY Broker 5.0. We can see the the changes from the previous import is trying to be reimported (e.g., trying to add a value to an attribute in both runs).

From previous discussions this issue is likely on the MIM side because of a watermarking failure, but is there a known workaround that can be put in to UNIFY Broker to manage this?

0
Answered

Unable to create Oracle DB agent on IDb v5.3.1 - Error Invalid connection string

Rizwan Ahmed 6 years ago updated by Matthew Davis (Technical Product Manager) 6 years ago 6

We are trying to configure Oracle agent on IdB v5.3.1 Revision #0. Took the sample connection string at https://voice.unifysolutions.net/knowledge-bases/7/articles/2863-oracle-database-agent

as below but IdB does not accept the connection string and raise an error 'Invalid connection string' on "Save Agent"

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostName)(PORT=1251)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=serviceName)));

We want to user a connection string is following format, if that is supported.

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort))(CONNECT_DATA=(SERVICE_NAME=MyOracleSID)));
User Id=myUsername;Password=myPassword;

Answer

Hey Rizwan,

The second connection string that you've provided works as a valid input into UNIFYBroker. Can you give it a go and see if it connects to the database correctly?

Unfortunately the oracle page for connection strings no longer exists. See this link for an archive of it: https://web.archive.org/web/20130627000544/https://docs.oracle.com/cd/E11882_01/win.112/e18754/featConnecting.htm .

I'll update our documentation page with more relevant information 

0
Fixed

This operation returned because the timeout period expired

Bob Bradley 6 years ago updated by Beau Harrison (Senior Product Software Engineer) 6 years ago 10

After many hours of processing the initial data load we are seeing repeated exceptions such as the following in the logs:

20190210,21:51:22,UNIFY Identity Broker,Adapter,Error,"Adapter
Adapter c700d25d-1825-4caf-ad26-b01910879914 page errored on page reflection. Duration: 00:00:17.3285030. Error: System.AggregateException: One or more errors occurred. ---> System.ApplicationException: This operation returned because the timeout period expired. (Exception from HRESULT: 0x800705B4)
   at System.Threading.ReaderWriterLock.AcquireWriterLockInternal(Int32 millisecondsTimeout)
   at System.Threading.ReaderWriterLock.AcquireWriterLock(TimeSpan timeout)
   at Unify.Framework.Collections.ThreadsafeHashSet`1.Add(T item)
   at Unify.Product.IdentityBroker.EntityBase`3.SetValue[TValue](TKey key, TValue value)
   at Unify.Product.IdentityBroker.AttributeMapper.MapAttributeValues(IEntity leftSideEntity, IEntity rightSideEntity)
   at System.Linq.Parallel.PartitionedDataSource`1.ListContiguousIndexRangeEnumerator.MoveNext(T& currentElement, Int32& currentKey)
   at System.Linq.Parallel.PipelineSpoolingTask`2.SpoolingWork()
   at System.Linq.Parallel.SpoolingTaskBase.Work()
   at System.Linq.Parallel.QueryTask.BaseWork(Object unused)
   at System.Threading.Tasks.Task.Execute()
   --- End of inner exception stack trace ---
   at System.Linq.Parallel.QueryTaskGroupState.QueryEnd(Boolean userInitiatedDispose)
   at System.Linq.Parallel.AsynchronousChannelMergeEnumerator`1.MoveNextSlowPath()
   at System.Linq.Parallel.QueryOpeningEnumerator`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source, TAccumulate seed, Func`3 func)
   at Unify.Product.IdentityBroker.Adapter.ReflectChangesInner()
   at Unify.Product.IdentityBroker.Adapter.ReflectChanges()
   at Unify.Product.IdentityBroker.AdapterAuditingDecorator.ReflectChanges()
   at Unify.Product.IdentityBroker.AdapterNotifierDecorator.ReflectChanges()
   at Unify.Product.IdentityBroker.ReflectAdapterOnChangeDueJob.<runbase>b__9_0(IOperationalAdapter adapter)
---> (Inner Exception #0) System.ApplicationException: This operation returned because the timeout period expired. (Exception from HRESULT: 0x800705B4)
   at System.Threading.ReaderWriterLock.AcquireWriterLockInternal(Int32 millisecondsTimeout)
   at System.Threading.ReaderWriterLock.AcquireWriterLock(TimeSpan timeout)
   at Unify.Framework.Collections.ThreadsafeHashSet`1.Add(T item)
   at Unify.Product.IdentityBroker.EntityBase`3.SetValue[TValue](TKey key, TValue value)
   at Unify.Product.IdentityBroker.AttributeMapper.MapAttributeValues(IEntity leftSideEntity, IEntity rightSideEntity)
   at System.Linq.Parallel.PartitionedDataSource`1.ListContiguousIndexRangeEnumerator.MoveNext(T& currentElement, Int32& currentKey)
   at System.Linq.Parallel.PipelineSpoolingTask`2.SpoolingWork()
   at System.Linq.Parallel.SpoolingTaskBase.Work()
   at System.Linq.Parallel.QueryTask.BaseWork(Object unused)
   at System.Threading.Tasks.Task.Execute()<---

---> (Inner Exception #1) System.ApplicationException: This operation returned because the timeout period expired. (Exception from HRESULT: 0x800705B4)
   at System.Threading.ReaderWriterLock.AcquireWriterLockInternal(Int32 millisecondsTimeout)
   at System.Threading.ReaderWriterLock.AcquireWriterLock(TimeSpan timeout)
   at Unify.Framework.Collections.ThreadsafeCollectionBase`2.Remove(TValue item)
   at Unify.Framework.Data.LinqContextConversionWithUpdateBase`5.UpdateOnSubmitDelegate(TInterface obj)
   at Unify.Product.IdentityBroker.EntityBase`3.SetValue[TValue](TKey key, TValue value)
   at Unify.Product.IdentityBroker.AttributeMapper.MapAttributeValues(IEntity leftSideEntity, IEntity rightSideEntity)
   at System.Linq.Parallel.PartitionedDataSource`1.ListContiguousIndexRangeEnumerator.MoveNext(T& currentElement, Int32& currentKey)
   at System.Linq.Parallel.PipelineSpoolingTask`2.SpoolingWork()
   at System.Linq.Parallel.SpoolingTaskBase.Work()
   at System.Linq.Parallel.QueryTask.BaseWork(Object unused)
   at System.Threading.Tasks.Task.Execute()<---
.
Error details:
System.AggregateException: One or more errors occurred. ---> System.ApplicationException: This operation returned because the timeout period expired. (Exception from HRESULT: 0x800705B4)
   at System.Threading.ReaderWriterLock.AcquireWriterLockInternal(Int32 millisecondsTimeout)
   at System.Threading.ReaderWriterLock.AcquireWriterLock(TimeSpan timeout)
   at Unify.Framework.Collections.ThreadsafeHashSet`1.Add(T item)
   at Unify.Product.IdentityBroker.EntityBase`3.SetValue[TValue](TKey key, TValue value)
   at Unify.Product.IdentityBroker.AttributeMapper.MapAttributeValues(IEntity leftSideEntity, IEntity rightSideEntity)
   at System.Linq.Parallel.PartitionedDataSource`1.ListContiguousIndexRangeEnumerator.MoveNext(T& currentElement, Int32& currentKey)
   at System.Linq.Parallel.PipelineSpoolingTask`2.SpoolingWork()
   at System.Linq.Parallel.SpoolingTaskBase.Work()
   at System.Linq.Parallel.QueryTask.BaseWork(Object unused)
   at System.Threading.Tasks.Task.Execute()
   --- End of inner exception stack trace ---
   at System.Linq.Parallel.QueryTaskGroupState.QueryEnd(Boolean userInitiatedDispose)
   at System.Linq.Parallel.AsynchronousChannelMergeEnumerator`1.MoveNextSlowPath()
   at System.Linq.Parallel.QueryOpeningEnumerator`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source, TAccumulate seed, Func`3 func)
   at Unify.Product.IdentityBroker.Adapter.ReflectChangesInner()
   at Unify.Product.IdentityBroker.Adapter.ReflectChanges()
   at Unify.Product.IdentityBroker.AdapterAuditingDecorator.ReflectChanges()
   at Unify.Product.IdentityBroker.AdapterNotifierDecorator.ReflectChanges()
   at Unify.Product.IdentityBroker.ReflectAdapterOnChangeDueJob.<runbase>b__9_0(IOperationalAdapter adapter)
---> (Inner Exception #0) System.ApplicationException: This operation returned because the timeout period expired. (Exception from HRESULT: 0x800705B4)
   at System.Threading.ReaderWriterLock.AcquireWriterLockInternal(Int32 millisecondsTimeout)
   at System.Threading.ReaderWriterLock.AcquireWriterLock(TimeSpan timeout)
   at Unify.Framework.Collections.ThreadsafeHashSet`1.Add(T item)
   at Unify.Product.IdentityBroker.EntityBase`3.SetValue[TValue](TKey key, TValue value)
   at Unify.Product.IdentityBroker.AttributeMapper.MapAttributeValues(IEntity leftSideEntity, IEntity rightSideEntity)
   at System.Linq.Parallel.PartitionedDataSource`1.ListContiguousIndexRangeEnumerator.MoveNext(T& currentElement, Int32& currentKey)
   at System.Linq.Parallel.PipelineSpoolingTask`2.SpoolingWork()
   at System.Linq.Parallel.SpoolingTaskBase.Work()
   at System.Linq.Parallel.QueryTask.BaseWork(Object unused)
   at System.Threading.Tasks.Task.Execute()<---

---> (Inner Exception #1) System.ApplicationException: This operation returned because the timeout period expired. (Exception from HRESULT: 0x800705B4)
   at System.Threading.ReaderWriterLock.AcquireWriterLockInternal(Int32 millisecondsTimeout)
   at System.Threading.ReaderWriterLock.AcquireWriterLock(TimeSpan timeout)
   at Unify.Framework.Collections.ThreadsafeCollectionBase`2.Remove(TValue item)
   at Unify.Framework.Data.LinqContextConversionWithUpdateBase`5.UpdateOnSubmitDelegate(TInterface obj)
   at Unify.Product.IdentityBroker.EntityBase`3.SetValue[TValue](TKey key, TValue value)
   at Unify.Product.IdentityBroker.AttributeMapper.MapAttributeValues(IEntity leftSideEntity, IEntity rightSideEntity)
   at System.Linq.Parallel.PartitionedDataSource`1.ListContiguousIndexRangeEnumerator.MoveNext(T& currentElement, Int32& currentKey)
   at System.Linq.Parallel.PipelineSpoolingTask`2.SpoolingWork()
   at System.Linq.Parallel.SpoolingTaskBase.Work()
   at System.Linq.Parallel.QueryTask.BaseWork(Object unused)
   at System.Threading.Tasks.Task.Execute()<---
",Normal</runbase></runbase>

During this time the CPU is near 100% and the processed entity counts do not seem to move - we have been stuck on Processed Entity Count = 30304, Pending Changes = 7654 since 4:30 am this morning.

Logs will be attached along with Extensibility files in the ticket comments.

Identity Broker version is 5.2.1 RTM

Broker console is presently unresponsive.

Additionally we understand there may be one or more duplicates present in the source data, and there is at least one adapter join which is not on a keyed column.

Urgent assistance is requested to identify and resolve issues preventing data load and completion of deployment (TEST and PROD in parallel) to allow customer UAT to commence.

0
Answered

Import from connector failed with reason User Not Found. User: None

Hi is there any guidance on what this error means? I'm getting it on imports on a powershell connector. I assumed that it meant it's trying to commit an entity that's missing some attribute but the code seems to be correct. Snippet and error follow.

Only ID is a required attribute.

Relevant part of import.ps1


if ($msoluser.ImmutableID)

{

## Create or update IdB entity

$entity = $entities.Create()

$entity['ID'] = $msoluser.ImmutableID

$entity['UPN'] = $msoluser.UserPrincipalName

$entity['isLicensed'] = $msoluser.isLicensed

$entity['Alumni'] = $Alumni

$entity['UserStatus'] = $UserStatus

$entity['CheckLicense'] = $CheckLicense

$entity.Commit()

}

Error in IDB logs:

Import changes from connector Office 365 Student Connector failed with reason User Not Found.  User: none.. Duration: 00:45:45.8101253
Error details:
Microsoft.Online.Administration.Automation.MicrosoftOnlineException: User Not Found.  User: none.
   at Unify.Product.IdentityBroker.PowerShellConnector.d__30.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Unify.Framework.Collections.ActionOnExceptionEnumerator`1.MoveNext()
   at Unify.Framework.Collections.EnumerableExtensions.d__10`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Unify.Product.IdentityBroker.ChangeDetectionEntityPollJob.RunBase()
   at Unify.Framework.DefinedScopeJobAuditTrailJobDecorator.Run()
   at Unify.Product.IdentityBroker.ConnectorJobExecutor.<>c__DisplayClass33_0.b__0()
   at Unify.Framework.AsynchronousJobExecutor.PerformJobCallback(Object state)",Normal
Answer

Hi Tom, based of the exception type it looks like an exception generated by the Microsoft code that's fetching a user.

Microsoft.Online.Administration.Automation.MicrosoftOnlineException: User Not Found.  User: none.

Using the PowerShell logger to add additional logging around keep parts of the script should help you confirm this and debug further.

0
Answered

Does This Connector Require Unify Identity for Aderant Expert?

Daniel Walters 6 years ago updated by Beau Harrison (Senior Product Software Engineer) 6 years ago 4

There's no adapter using Aderant expert however this connector references it and I have a service not starting. Does the below configuration indicate that Unify for Aderant Expert is required?

Image 5079

Answer

Adapters do not require knowledge of a connectors type, they just reference them by id.

The configuration provided is that of an Aderant connector. You'd need the Aderant connector installed for this configuration to load, yes.