diff --git a/sdk/identity/Azure.Identity/CHANGELOG.md b/sdk/identity/Azure.Identity/CHANGELOG.md index d47cfb7148c57..c9773f83c0cdc 100644 --- a/sdk/identity/Azure.Identity/CHANGELOG.md +++ b/sdk/identity/Azure.Identity/CHANGELOG.md @@ -2,16 +2,21 @@ ## 1.4.0-beta.3 (Unreleased) +### Breaking Changes + +- The `IDisposable` interface has been removed from `TokenCache`. ## 1.4.0-beta.2 (2021-01-29) ### Fixes and improvements + - Fixed issue in `HttpExtensions` causing the omission of content headers on requests ([#17448](https://github.com/Azure/azure-sdk-for-net/issues/17448)) - Made `EnvironmentCredential` to account for both null and empty string when checking for the presense of the environment variables ([#18031](https://github.com/Azure/azure-sdk-for-net/issues/18031)) ## 1.4.0-beta.1 (2020-10-15) ### New Features + - Redesigned Application Authentication APIs - Adds `TokenCache` and `PersistentTokenCache` classes to give more user control over how the tokens are cached and how the cache is persisted. - Adds `TokenCache` property to options for credentials supporting token cache configuration. @@ -19,10 +24,12 @@ ## 1.3.0 (2020-11-12) ### New Features + - Added support for Service Fabric managed identity authentication to `ManagedIdentityCredential`. - Added support for Azure Arc managed identity authentication to `ManagedIdentityCredential`. ### Fixes and improvements + - Fix race condition in `ProcessRunner` causing `VisualStudioCredential` and `AzureCliCredential` to fail intermittently ([#16211](https://github.com/Azure/azure-sdk-for-net/issues/16211)) - Fix `VisualStudioCodeCredential` to raise `CredentialUnavailableException` when reading from VS Code's stored secret ([#16795](https://github.com/Azure/azure-sdk-for-net/issues/16795)) - Prevent `VisualStudioCodeCredential` using invalid authentication data when no user is signed in to Visual Studio Code ([#15870](https://github.com/Azure/azure-sdk-for-net/issues/15870)) @@ -32,6 +39,7 @@ - Fix cache loading issue in `SharedTokenCacheCredential` on Linux ([#12939](https://github.com/Azure/azure-sdk-for-net/issues/12939)) ### Breaking Changes + - Rename property `IncludeX5CCliamHeader` on `ClientCertificateCredentialOptions` to `SendCertificateChain` - Removing Application Authentication APIs for GA release. These will be reintroduced in 1.4.0-beta.1. - Removed class `AuthenticationRecord` @@ -46,16 +54,19 @@ ## 1.3.0-beta.2 (2020-10-07) ### New Features + - Update `DeviceCodeCredential` to output device code information and authentication instructions in the console, in the case no `deviceCodeCallback` is specified. - Added `DeviceCodeCallback` to `DeviceCodeCredentialOptions` - Added default constructor to `DeviceCodeCredential` ### Breaking Changes + - Replaced `DeviceCodeCredential` constructor overload taking `deviceCodeCallback` and `DeviceCodeCredentialOptions` with constructor taking only `DeviceCodeCredentialOptions` ## 1.3.0-beta.1 (2020-09-11) ### New Features + - Restoring Application Authentication APIs from 1.2.0-preview.6 - Added support for App Service Managed Identity API version `2019-08-01` ([#13687](https://github.com/Azure/azure-sdk-for-net/issues/13687)) - Added `IncludeX5CClaimHeader` to `ClientCertificateCredentialOptions` to enable subject name / issuer authentication with the `ClientCertificateCredential`. @@ -64,6 +75,7 @@ - Unify exception handling between `DefaultAzureCredential` and `ChainedTokenCredential` ([#14408](https://github.com/Azure/azure-sdk-for-net/issues/14408)) ### Fixes and improvements + - Updated `MsalPublicClient` and `MsalConfidentialClient` to respect `CancellationToken` during initialization ([#13201](https://github.com/Azure/azure-sdk-for-net/issues/13201)) - Fixed `VisualStudioCodeCredential` crashes on macOS (Issue [#14362](https://github.com/Azure/azure-sdk-for-net/issues/14362)) - Fixed issue with non GUID Client Ids (Issue [#14585](https://github.com/Azure/azure-sdk-for-net/issues/14585)) @@ -72,22 +84,26 @@ ## 1.2.3 (2020-09-11) ### Fixes and improvements + - Fixed issue with `DefaultAzureCredential` incorrectly catching `AuthenticationFailedException` (Issue [#14974](https://github.com/Azure/azure-sdk-for-net/issues/14974)) - Fixed issue with `DefaultAzureCredential` throwing exceptions during concurrent calls (Issue [#15013](https://github.com/Azure/azure-sdk-for-net/issues/15013)) ## 1.2.2 (2020-08-20) ### Fixes and improvements + - Fixed issue with `InteractiveBrowserCredential` not specifying correct redirectUrl (Issue [#13940](https://github.com/Azure/azure-sdk-for-net/issues/13940)) ## 1.2.1 (2020-08-18) ### Fixes and improvements + - Bug in TaskExtensions.EnsureCompleted method that causes it to unconditionally throw an exception in the environments with synchronization context ## 1.2.0 (2020-08-10) ### Breaking Changes + - Removing Application Authentication APIs for GA release. These will be reintroduced in 1.3.0-preview. - Removed class `AuthenticationRecord` - Removed class `AuthenticationRequiredException` @@ -102,19 +118,21 @@ - Removed properties `AllowUnencryptedCache`and `AuthenticationRecord` from `SharedTokenCacheCredentialOptions` ### Fixes and improvements + - Fixed excess errors in `DefaultAzureCredential` tracing (Issue [#10659](https://github.com/Azure/azure-sdk-for-net/issues/10659)) - Fixed concurrency issue in `DefaultAzureCredential` (Issue [#13044](https://github.com/Azure/azure-sdk-for-net/issues/13044)) - ## 1.2.0-preview.6 (2020-07-22) ### New Features + - Added the read only property `ClientId` to `AuthenticationRecord`. - Added the property `AllowUnencryptedCache` to the option classes `ClientCertificateCredentialOptions`, `ClientSecretCredentialOptions`, `DeviceCodeCredentialOptions`, `InteractiveBrowserCredentialOptions` and `SharedTokenCacheCredentialOptions` which when set to true allows the credential to fall back to storing tokens in an unencrypted file if no OS level user encryption is available when `EnablePersistentCache` is set to true. - Added the property `AuthenticationRecord` to the option class `SharedTokenCacheCredentialOptions` to support silent authentication for accounts previously authenticated with an interactive credential. - Added option class `UsernamePasswordCredentialOptions` which supports the options `EnablePersistentCache` and `AllowUnencryptedCache`. ### Breaking Changes + - Rename type `KnownAuthorityHosts` to `AzureAuthorityHosts` - Rename property `AzureChinaCloud` to `AzureChina` - Rename property `AzureGermanCloud` to `AzureGermany` @@ -124,23 +142,26 @@ ## 1.2.0-preview.5 (2020-07-08) ### New Features + - Added options classes `ClientCertificateCredentialOptions` and `ClientSecretCredentialOptions` which support the following new option - `EnablePersistentCache` configures these credentials to use a persistent cache shared between credentials which set this option. By default the cache is per credential and in memory only. - ## 1.2.0-preview.4 (2020-06-10) ### New Features + - Makes `AzureCliCredential`, `VisualStudioCredential` and `VisualStudioCodeCredential` public to allow direct usage. - Added `Authenticate` methods to `UsernamePasswordCredential` ### Fixes and improvements + - Fix `SharedTokenCacheCredential` account filter to be case-insensitive (Issue [#10816](https://github.com/Azure/azure-sdk-for-net/issues/10816)) - Update `VisualStudioCodeCredential` to properly throw `CredentialUnavailableException` when re-authentication is needed. (Issue [#11595](https://github.com/Azure/azure-sdk-for-net/issues/11595)) ## 1.2.0-preview.3 (2020-05-05) ### New Features + - First preview of new API for authenticating users with `DeviceCodeCredential` and `InteractiveBrowserCredential` - Added method `Authenticate` which pro-actively interacts with the user to authenticate if necessary and returns a serializable `AuthenticationRecord` - Added Options classes `DeviceCodeCredentialOptions` and `InteractiveBrowserCredentialOptions` which support the following new options @@ -151,23 +172,27 @@ ## 1.2.0-preview.2 (2020-04-06) ### New Features + - Updates `DefaultAzureCredential` to enable authenticating through Visual Studio - Updates `DefaultAzureCredential` to enable authentication through Visual Studio Code ## 1.2.0-preview.1 (2020-03-10) ### New Features + - Updating `DefaultAzureCredential` to enable authenticating through the Azure CLI - `ClientCertificateCredential` now supports being constructed with a path to an unencrypted certificate (in either PFX or PEM format) - `EnvironmentCredential` now supports reading a certificate path from `AZURE_CLIENT_CERTIFICATE_PATH` ### Fixes and improvements + - Fix an issue where `EnvironmentCredential` did not behave correctly when `AZURE_USERNAME` and `AZURE_PASSWORD` where set - Added `KnownAuthorityHosts` class to aid in sovereign cloud configuration. ## 1.1.1 (2020-02-10) ### Fixes and improvements + - Fixed `UsernamePasswordCredential` constructor parameter mishandling - Updated `ManagedIdentityCredential` endpoint discovery to avoid throwing - Fixed `ManagedIdentityCredential` to raise `CredentialUnavailableException` on 400 return from the service where no identity has been assigned @@ -176,6 +201,7 @@ ## 1.1.0 (2019-11-25) ### Fixes and improvements + - Update `SharedTokenCacheCredential` to filter accounts by tenant id - Added `SharedTokenCacheCredentialOptions` class with properties `TenantId` and `Username` - Added constructor overload to `SharedTokenCacheCredential` which accepts `SharedTokenCacheCredentialOptions` @@ -185,9 +211,11 @@ - Fixed issue with `ManagedIdentityCredential` authentication with user assigned identities ## 1.0.0 (2019-10-29) + - First stable release of Azure.Identity package. ### Breaking Changes + - Rename `AzureCredentialOptions` -> `TokenCredentialOptions` - Renamed property `VerificationUrl` -> `VerificationUri` and changed type from `string` to `Uri` - Updated `ClientSecretCredential` class @@ -219,44 +247,53 @@ - Added the `CredentialUnavailableExcpetion` exception type to distinguish cases when failure to obtain an `AccessToken` was expected ### Dependency Changes + - Adopted Azure.Core 1.0.0 ### Fixes and improvements + - Update `ManagedIdentityCredential` IMDS availability check to handle immediate network failures - Added a `DefaultAzureCredential` constructor overload to enable interactive credential types by default ## 1.0.0-preview.5 (2019-10-07) ### Dependency Changes + - Adopted Azure.Core 1.0.0-preview.9 ### New Features + - Added `DefaultAzureCredentialOptions` for configuring the `DefaultAzureCredential` authentication flow - Added `InteractiveBrowserCredential` to the `DefaultAzureCredential` authentication flow, but excluded by default ### Fixes and improvements + - Updated `InteractiveBrowserCredential` and `DeviceCodeCredential` to optionally accept a tenantId to support non-multitenant applications ## 1.0.0-preview.4 (2019-09-10) ### Breaking Changes + - Modified GetToken abstraction to accept `TokenRequest` structure rather than `string[]` for forwards compatibility ### Dependency Changes + - Adopted Azure.Core 1.0.0-preview.8 ### New Features + - Added `SharedTokenCacheCredential` to support Single Sign On with developer tooling - Updated `DefaultAzureCredential`authentication flow to include the `SharedTokenCacheCredential` - ## 1.0.0-preview.3 (2019-08-06) ### Dependency Changes + - Adopted Azure.Core 1.0.0-preview.7 - Adopted Microsoft.Identity.Client 4.1.0 ### New Features + - User Principal Authentication - Added `DeviceCodeCredential` class - Added `InteractiveBrowserCredential` class @@ -264,14 +301,14 @@ - Support for Azure SDK ASP .NET Core integration ### Fixes and improvements -- Added identity client distributed tracing support +- Added identity client distributed tracing support ## 1.0.0-preview.2 (2019-07-02) ### Fixes and improvements -- Fix to ManagedIdentityCredential to properly parse expires_on from response +- Fix to ManagedIdentityCredential to properly parse expires_on from response ## 1.0.0-preview.1 (2019-06-27) @@ -279,6 +316,7 @@ Version 1.0.0-preview.1 is the first preview of our efforts to create a user-fri information about preview releases of other Azure SDK libraries, please visit https://aka.ms/azure-sdk-preview1-net. ### New Features + - Azure Service Authentication - Added `DefaultAzureCredential` class - Added `ChainedTokenCredential` class diff --git a/sdk/identity/Azure.Identity/api/Azure.Identity.netstandard2.0.cs b/sdk/identity/Azure.Identity/api/Azure.Identity.netstandard2.0.cs index b00f08cdc215d..1c131ee7dcea2 100644 --- a/sdk/identity/Azure.Identity/api/Azure.Identity.netstandard2.0.cs +++ b/sdk/identity/Azure.Identity/api/Azure.Identity.netstandard2.0.cs @@ -225,14 +225,12 @@ public SharedTokenCacheCredentialOptions(Azure.Identity.TokenCache tokenCache) { public Azure.Identity.TokenCache TokenCache { get { throw null; } } public string Username { get { throw null; } set { } } } - public partial class TokenCache : System.IDisposable + public partial class TokenCache { public TokenCache() { } public event System.Func Updated { add { } remove { } } public static Azure.Identity.TokenCache Deserialize(System.IO.Stream stream, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; } public static System.Threading.Tasks.Task DeserializeAsync(System.IO.Stream stream, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; } - public void Dispose() { } - protected virtual void Dispose(bool disposing) { } public void Serialize(System.IO.Stream stream, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { } public System.Threading.Tasks.Task SerializeAsync(System.IO.Stream stream, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; } } diff --git a/sdk/identity/Azure.Identity/src/TokenCache.cs b/sdk/identity/Azure.Identity/src/TokenCache.cs index 5596c567e24d6..f9e4e77ac4289 100644 --- a/sdk/identity/Azure.Identity/src/TokenCache.cs +++ b/sdk/identity/Azure.Identity/src/TokenCache.cs @@ -2,28 +2,27 @@ // Licensed under the MIT License. using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using Azure.Core.Pipeline; using Microsoft.Identity.Client; -using Microsoft.Identity.Client.Extensions.Msal; namespace Azure.Identity { /// /// A cache for Tokens. /// - public class TokenCache : IDisposable +#pragma warning disable CA1001 // Types that own disposable fields should be disposable + // SemaphoreSlim only needs to be disposed when AvailableWaitHandle is called. + public class TokenCache +#pragma warning restore CA1001 // Types that own disposable fields should be disposable { private SemaphoreSlim _lock = new SemaphoreSlim(1,1); private byte[] _data; private DateTimeOffset _lastUpdated; private ConditionalWeakTable _cacheAccessMap; - private bool _disposedValue; private class CacheTimestamp { @@ -172,11 +171,6 @@ internal virtual async Task RegisterCache(bool async, ITokenCache tokenCache, Ca private async Task OnBeforeCacheAccessAsync(TokenCacheNotificationArgs args) { - if (_disposedValue) - { - throw new ObjectDisposedException(nameof(TokenCache)); - } - await _lock.WaitAsync().ConfigureAwait(false); try @@ -193,11 +187,6 @@ private async Task OnBeforeCacheAccessAsync(TokenCacheNotificationArgs args) private async Task OnAfterCacheAccessAsync(TokenCacheNotificationArgs args) { - if (_disposedValue) - { - throw new ObjectDisposedException(nameof(TokenCache)); - } - if (args.HasStateChanged) { await UpdateCacheDataAsync(args.TokenCache).ConfigureAwait(false); @@ -255,36 +244,5 @@ private static async Task MergeCacheData(byte[] cacheA, byte[] cacheB) return merged; } - - /// - /// Disposes of the . - /// - /// Indicates whether managed resources should be disposed. - protected virtual void Dispose(bool disposing) - { - if (!_disposedValue) - { - if (disposing) - { - _lock.Dispose(); - } - - _cacheAccessMap = null; - - _data = null; - - _disposedValue = true; - } - } - - /// - /// Disposes of the . - /// - public void Dispose() - { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method - Dispose(disposing: true); - GC.SuppressFinalize(this); - } } }