# TenantProviderBinding

> Tracon documentation. Tracon is a .NET package family that adds a control
> plane on Microsoft Agent Framework, published as NuGet packages that run
> inside your own ASP.NET Core application.
>
> Page: https://tracon.dev/api/tracon.tenantproviderbinding/
> Summary: TenantProviderBinding: Binds a tenant to a provider's credential, by name only.

<div class="api-provenance">Namespace Tracon · Assembly <code>Tracon.Abstractions.dll</code></div>

Binds a tenant to a provider's credential, by **name** only.

```csharp
public sealed record TenantProviderBinding : IEquatable<TenantProviderBinding>
```

<dl class="api-relations"><dt>Inheritance</dt><dd><a href="https://learn.microsoft.com/dotnet/api/system.object">object</a> ← <a href="/api/tracon.tenantproviderbinding/">TenantProviderBinding</a></dd><dt>Implements</dt><dd><a href="https://learn.microsoft.com/dotnet/api/system.iequatable-1">IEquatable&lt;TenantProviderBinding&gt;</a></dd><dt>Inherited Members</dt><dd><a href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object?)</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object?, object?)</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object?, object?)</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a></dd></dl>

## Remarks

This record carries no secret value, only the name of the
configuration key the value is read from at call time.
applies to this store the same way it applies to MCP server credentials:
the database backup, the audit trail, and every HTTP response built from
this type never carry a secret.

## Constructors

### <a id="Tracon_TenantProviderBinding__ctor"></a> TenantProviderBinding\(\)

```csharp
public TenantProviderBinding()
```

## Properties

### <a id="Tracon_TenantProviderBinding_ApiKeyConfigurationName"></a> ApiKeyConfigurationName

Gets the configuration **key name** the credential value is
read from. Never the value itself.

```csharp
public required string ApiKeyConfigurationName { get; init; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

#### Remarks

Must start with [TraconTenantProviderOptions.AllowedConfigurationPrefix](/api/tracon.tracontenantprovideroptions/#Tracon_TraconTenantProviderOptions_AllowedConfigurationPrefix);
resolution is rejected otherwise.

### <a id="Tracon_TenantProviderBinding_Endpoint"></a> Endpoint

Gets the optional provider endpoint override for this tenant.

```csharp
public string? Endpoint { get; init; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)?

### <a id="Tracon_TenantProviderBinding_ProviderName"></a> ProviderName

Gets the provider name. Matches [ModelBinding.Provider](/api/tracon.modelbinding/#Tracon_ModelBinding_Provider) for a model
provider, and [ISpeechSynthesizer.ProviderName](/api/tracon.ispeechsynthesizer/#Tracon_ISpeechSynthesizer_ProviderName) or
[ISpeechTranscriber.ProviderName](/api/tracon.ispeechtranscriber/#Tracon_ISpeechTranscriber_ProviderName) for a speech provider.

```csharp
public required string ProviderName { get; init; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

#### Remarks

Compared **case-insensitively**, like every other place a
provider name is matched (the provider registry, the tenant egress
policy, the admin endpoint). A store persists the value
[TenantProviderBinding.NormalizeProviderName](/api/tracon.tenantproviderbinding/#Tracon_TenantProviderBinding_NormalizeProviderName_System_String_) returns, so `"OpenAI"` and
`"openai"` are one binding and never two.

### <a id="Tracon_TenantProviderBinding_TenantId"></a> TenantId

Gets the tenant this binding belongs to.

```csharp
public required string TenantId { get; init; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

### <a id="Tracon_TenantProviderBinding_UpdatedAt"></a> UpdatedAt

Gets the time this binding was last written.

```csharp
public required DateTimeOffset UpdatedAt { get; init; }
```

#### Property Value

 [DateTimeOffset](https://learn.microsoft.com/dotnet/api/system.datetimeoffset)

## Methods

### <a id="Tracon_TenantProviderBinding_Equals_System_Object_"></a> Equals\(object?\)

```csharp
public override bool Equals(object? obj)
```

#### Parameters

`obj` [object](https://learn.microsoft.com/dotnet/api/system.object)?

#### Returns

 [bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### <a id="Tracon_TenantProviderBinding_Equals_Tracon_TenantProviderBinding_"></a> Equals\(TenantProviderBinding?\)

```csharp
public bool Equals(TenantProviderBinding? other)
```

#### Parameters

`other` [TenantProviderBinding](/api/tracon.tenantproviderbinding/)?

#### Returns

 [bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### <a id="Tracon_TenantProviderBinding_GetHashCode"></a> GetHashCode\(\)

```csharp
public override int GetHashCode()
```

#### Returns

 [int](https://learn.microsoft.com/dotnet/api/system.int32)

### <a id="Tracon_TenantProviderBinding_NormalizeProviderName_System_String_"></a> NormalizeProviderName\(string\)

Returns the canonical form a store persists and looks a provider name
up by.

```csharp
public static string NormalizeProviderName(string providerName)
```

#### Parameters

`providerName` [string](https://learn.microsoft.com/dotnet/api/system.string)

The provider name as written by the caller.

#### Returns

 [string](https://learn.microsoft.com/dotnet/api/system.string)

The canonical (invariant lower-case) form.

#### Remarks

An [ITenantProviderBindingStore](/api/tracon.itenantproviderbindingstore/) implementation must apply
this to the name it writes *and* to the name it is queried with.
A store that skips it is case-sensitive while the rest of the system is
not, and a tenant whose binding was saved under a different letter case
silently falls through to the global setup credential — the wrong
tenant gets billed and no error is raised.

Normalizing the stored *value* (rather than comparing
case-insensitively at query time) is deliberate: a bare `=`
predicate then behaves identically on PostgreSQL, SQLite and SQL Server
whatever their collation, the primary key keeps rejecting duplicates on
all three, and the index stays usable.

#### Exceptions

 [ArgumentException](https://learn.microsoft.com/dotnet/api/system.argumentexception)

`providerName` is null or blank.

### <a id="Tracon_TenantProviderBinding_ToString"></a> ToString\(\)

```csharp
public override string ToString()
```

#### Returns

 [string](https://learn.microsoft.com/dotnet/api/system.string)

## Operators

### <a id="Tracon_TenantProviderBinding_op_Equality_Tracon_TenantProviderBinding_Tracon_TenantProviderBinding_"></a> operator ==\(TenantProviderBinding?, TenantProviderBinding?\)

```csharp
public static bool operator ==(TenantProviderBinding? left, TenantProviderBinding? right)
```

#### Parameters

`left` [TenantProviderBinding](/api/tracon.tenantproviderbinding/)?

`right` [TenantProviderBinding](/api/tracon.tenantproviderbinding/)?

#### Returns

 [bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### <a id="Tracon_TenantProviderBinding_op_Inequality_Tracon_TenantProviderBinding_Tracon_TenantProviderBinding_"></a> operator \!=\(TenantProviderBinding?, TenantProviderBinding?\)

```csharp
public static bool operator !=(TenantProviderBinding? left, TenantProviderBinding? right)
```

#### Parameters

`left` [TenantProviderBinding](/api/tracon.tenantproviderbinding/)?

`right` [TenantProviderBinding](/api/tracon.tenantproviderbinding/)?

#### Returns

 [bool](https://learn.microsoft.com/dotnet/api/system.boolean)
