Skip to content

Commit f14cd40

Browse files
authored
Merge pull request #134 from dlmelendez/rel/10.0
Rel/10.0 rc1
2 parents 6114724 + 429ddb4 commit f14cd40

File tree

62 files changed

+331
-180
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+331
-180
lines changed

.editorconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ csharp_style_prefer_primary_constructors = false:suggestion
144144
csharp_prefer_system_threading_lock = true:suggestion
145145
csharp_style_expression_bodied_lambdas = true:silent
146146
csharp_style_expression_bodied_local_functions = false:silent
147+
csharp_style_prefer_simple_property_accessors = true:suggestion
148+
dotnet_diagnostic.xUnit1033.severity = none
147149

148150
[*.vb]
149151
# Modifier preferences

azure-pipelines.yml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@ trigger:
88

99
name: $(BuildVersion).$(Date:yyMMdd).$(Rev:r)
1010

11+
variables:
12+
buildNumberVersion: '$(build.buildnumber)'
13+
1114
pool:
1215
vmImage: 'ubuntu-latest'
1316

1417
steps:
18+
- bash: echo 'Starting Build..'
19+
- bash: echo $(buildNumberVersion)
20+
1521
- task: PowerShell@2
1622
inputs:
1723
targetType: 'inline'
@@ -28,15 +34,16 @@ steps:
2834
version: 8.x
2935

3036
- task: UseDotNet@2
31-
displayName: 'Use .Net Core sdk 9.x'
37+
displayName: 'Use .NET 10 SDK'
3238
inputs:
33-
version: 9.x
39+
version: 10.0.x
40+
includePreviewVersions: true
3441

3542
- task: DotNetCoreCLI@2
3643
displayName: 'dotnet build'
3744
inputs:
3845
projects: '**/ElCamino.AspNetCore.Identity.AzureTable.sln'
39-
arguments: '-c $(BuildConfiguration) -p:Version=$(BuildVersion)'
46+
arguments: '-c $(BuildConfiguration) -p:Version=$(buildNumberVersion)'
4047

4148
- task: DotNetCoreCLI@2
4249
inputs:

src/ElCamino.AspNetCore.Identity.AzureTable.Model/ElCamino.AspNetCore.Identity.AzureTable.Model.csproj

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
<Copyright>Copyright © David Melendez, MIT License</Copyright>
66
<AssemblyTitle>Azure Table Storage Provider for ASP.NET Identity Core Models</AssemblyTitle>
77
<Authors>David Melendez</Authors>
8-
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
9-
<LangVersion>13.0</LangVersion>
10-
<AssemblyName>ElCamino.AspNetCore.Identity.AzureTable.Model</AssemblyName>
8+
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
9+
<LangVersion>14.0</LangVersion>
10+
<AssemblyName>ElCamino.AspNetCore.Identity.AzureTable.Model</AssemblyName>
1111
<AssemblyOriginatorKeyFile>../../tools/key.snk</AssemblyOriginatorKeyFile>
1212
<SignAssembly>true</SignAssembly>
1313
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
@@ -22,7 +22,7 @@
2222
<RepositoryType>git</RepositoryType>
2323
<RepositoryUrl>https://github.com/dlmelendez/identityazuretable.git</RepositoryUrl>
2424
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
25-
<Version>9.0.5</Version>
25+
<Version>10.0</Version>
2626
<Nullable>enable</Nullable>
2727
<PackageProjectUrl>https://dlmelendez.github.io/identityazuretable</PackageProjectUrl>
2828
<PackageReadmeFile>README.md</PackageReadmeFile>
@@ -37,15 +37,19 @@
3737
<ItemGroup>
3838
<PackageReference Include="Azure.Data.Tables" Version="12.8.1" />
3939
</ItemGroup>
40-
<ItemGroup Condition=" '$(TargetFramework)' == 'net9.0' ">
41-
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="9.0.*" />
40+
<ItemGroup Condition=" '$(TargetFramework)' == 'net10.0' ">
41+
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="10.0.0-rc*" />
4242
</ItemGroup>
4343

44-
<ItemGroup Condition=" '$(TargetFramework)' != 'net9.0' ">
45-
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="8.0.*" />
46-
</ItemGroup>
47-
48-
<ItemGroup>
44+
<ItemGroup Condition=" '$(TargetFramework)' == 'net9.0' ">
45+
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="9.0.*" />
46+
</ItemGroup>
47+
48+
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
49+
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="8.0.*" />
50+
</ItemGroup>
51+
52+
<ItemGroup>
4953
<None Include="README.md" Link="README.md">
5054
<PackagePath>\</PackagePath>
5155
<Pack>True</Pack>

src/ElCamino.AspNetCore.Identity.AzureTable/ElCamino.AspNetCore.Identity.AzureTable.csproj

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
<Copyright>Copyright © David Melendez, MIT License</Copyright>
66
<AssemblyTitle>Azure Table Storage Provider for ASP.NET Identity Core</AssemblyTitle>
77
<Authors>David Melendez</Authors>
8-
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
9-
<LangVersion>13.0</LangVersion>
8+
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
9+
<LangVersion>14.0</LangVersion>
1010
<AssemblyName>ElCamino.AspNetCore.Identity.AzureTable</AssemblyName>
1111
<AssemblyOriginatorKeyFile>../../tools/key.snk</AssemblyOriginatorKeyFile>
1212
<SignAssembly>true</SignAssembly>
@@ -21,7 +21,7 @@
2121
<RepositoryType>git</RepositoryType>
2222
<RepositoryUrl>https://github.com/dlmelendez/identityazuretable.git</RepositoryUrl>
2323
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
24-
<Version>9.0.5</Version>
24+
<Version>10.0</Version>
2525
<PackageProjectUrl>https://dlmelendez.github.io/identityazuretable</PackageProjectUrl>
2626
<!--<DebugType>Full</DebugType>-->
2727
<!-- DebugType Full is needed for test code coverage, but .nuget symbols doesn't like it-->
@@ -38,13 +38,19 @@
3838
<PackageReference Include="Azure.Data.Tables" Version="12.8.1" />
3939
</ItemGroup>
4040

41-
<ItemGroup Condition=" '$(TargetFramework)' == 'net9.0' ">
42-
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="9.0.*" />
43-
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="9.0.*" />
44-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.*" />
41+
<ItemGroup Condition=" '$(TargetFramework)' == 'net10.0' ">
42+
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="10.0.0-rc*" />
43+
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="10.0.0-rc*" />
44+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0-rc*" />
4545
</ItemGroup>
4646

47-
<ItemGroup Condition=" '$(TargetFramework)' != 'net9.0' ">
47+
<ItemGroup Condition=" '$(TargetFramework)' == 'net9.0' ">
48+
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="9.0.*" />
49+
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="9.0.*" />
50+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.*" />
51+
</ItemGroup>
52+
53+
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
4854
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="8.0.*" />
4955
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="8.0.*" />
5056
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.*" />

src/ElCamino.AspNetCore.Identity.AzureTable/Helpers/BaseKeyHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public virtual ReadOnlySpan<char> GenerateRowKeyIdentityUserLogin(string? loginP
186186
}
187187

188188
/// <inheritdoc/>
189-
public double KeyVersion => 9.0;
189+
public double KeyVersion => 10.0;
190190

191191
/// <summary>
192192
/// Convert Key Data to a hex hash string

src/ElCamino.AspNetCore.Identity.AzureTable/IdentityCloudContext.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,17 @@ public IdentityCloudContext(IdentityConfiguration config, TableServiceClient cli
2626
ArgumentNullException.ThrowIfNull(client, nameof(client));
2727

2828
_client = client;
29-
_indexTable = _client.GetTableClient(FormatTableNameWithPrefix(config!.TablePrefix, !string.IsNullOrWhiteSpace(config!.IndexTableName) ? config!.IndexTableName! : TableConstants.TableNames.IndexTable));
30-
_roleTable = _client.GetTableClient(FormatTableNameWithPrefix(config!.TablePrefix, !string.IsNullOrWhiteSpace(config!.RoleTableName) ? config!.RoleTableName! : TableConstants.TableNames.RolesTable));
31-
_userTable = _client.GetTableClient(FormatTableNameWithPrefix(config!.TablePrefix, !string.IsNullOrWhiteSpace(config!.UserTableName) ? config!.UserTableName! : TableConstants.TableNames.UsersTable));
29+
_indexTable = _client.GetTableClient(FormatTableNameWithPrefix(config.TablePrefix, !string.IsNullOrWhiteSpace(config.IndexTableName) ? config.IndexTableName : TableConstants.TableNames.IndexTable));
30+
_roleTable = _client.GetTableClient(FormatTableNameWithPrefix(config.TablePrefix, !string.IsNullOrWhiteSpace(config.RoleTableName) ? config.RoleTableName : TableConstants.TableNames.RolesTable));
31+
_userTable = _client.GetTableClient(FormatTableNameWithPrefix(config.TablePrefix, !string.IsNullOrWhiteSpace(config.UserTableName) ? config.UserTableName : TableConstants.TableNames.UsersTable));
3232
}
3333

3434

3535
private static string FormatTableNameWithPrefix(string? tablePrefix, string baseTableName)
3636
{
3737
if (!string.IsNullOrWhiteSpace(tablePrefix))
3838
{
39-
return string.Format("{0}{1}", tablePrefix!, baseTableName);
39+
return string.Format("{0}{1}", tablePrefix, baseTableName);
4040
}
4141
return baseTableName;
4242
}

src/ElCamino.AspNetCore.Identity.AzureTable/UserOnlyStore.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,9 @@ protected async Task<IEnumerable<TUser>> GetUserAggregateQueryAsync(IEnumerable<
605605
var tasks = listTqs.Select((q) =>
606606
{
607607
return _userTable.QueryAsync<TableEntity>(filter: q, cancellationToken:cancellationToken).ToListAsync(cancellationToken)
608+
#if NET10_0_OR_GREATER
609+
.AsTask()
610+
#endif
608611
.ContinueWith((taskResults) =>
609612
{
610613
//ContinueWith returns completed task. Calling .Result is safe here.
@@ -1253,14 +1256,14 @@ string getTableQueryFilterByUserId(string userId)
12531256
return tqFilter.ToString();
12541257
}
12551258

1256-
return (await GetUsersByIndexQueryAsync(GetUserByClaimIndexQuery(claim).ToString(), (userId, ct) =>
1259+
return [.. (await GetUsersByIndexQueryAsync(GetUserByClaimIndexQuery(claim).ToString(), (userId, ct) =>
12571260
{
12581261
return GetUserAggregateQueryAsync(userId, setFilterByUserId: getTableQueryFilterByUserId, whereClaim: (uc) =>
12591262
{
12601263
return uc.RowKey.AsSpan().Equals(_keyHelper.GenerateRowKeyIdentityUserClaim(claim.Type, claim.Value), StringComparison.OrdinalIgnoreCase);
12611264
}, cancellationToken);
12621265

1263-
}, cancellationToken).ConfigureAwait(false)).ToList();
1266+
}, cancellationToken).ConfigureAwait(false))];
12641267
}
12651268

12661269
/// <summary>

src/ElCamino.AspNetCore.Identity.AzureTable/UserStore.cs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public virtual async Task<IList<string>> GetRolesAsync(TUser user, CancellationT
125125
throw new ArgumentNullException(nameof(user));
126126
}
127127

128-
const string roleName = nameof(Model.IdentityUserRole<string>.RoleName);
128+
const string roleName = nameof(Model.IdentityUserRole<>.RoleName);
129129
var userId = _keyHelper.GenerateRowKeyUserId(ConvertIdToString(user.Id));
130130
// Changing to a live query to mimic EF UserStore in Identity 3.0
131131

@@ -230,14 +230,14 @@ string getTableQueryFilterByUserId(string? userId)
230230
}
231231

232232

233-
return (await GetUsersByIndexQueryAsync(GetUserByRoleIndexQuery(roleName!).ToString(), (userId, cancellationToken) =>
233+
return [.. (await GetUsersByIndexQueryAsync(GetUserByRoleIndexQuery(roleName!).ToString(), (userId, cancellationToken) =>
234234
{
235235
return GetUserAggregateQueryAsync(userId, setFilterByUserId: getTableQueryFilterByUserId, whereClaim: null, whereRole: (ur) =>
236236
{
237237
return ur.RowKey.AsSpan().Equals(_keyHelper.GenerateRowKeyIdentityUserRole(roleName), StringComparison.OrdinalIgnoreCase);
238238
}, cancellationToken: cancellationToken);
239239

240-
}, cancellationToken).ConfigureAwait(false)).ToList();
240+
}, cancellationToken).ConfigureAwait(false))];
241241
}
242242

243243
return [];
@@ -264,21 +264,37 @@ public virtual async Task<bool> IsInRoleAsync(TUser user, string? roleName, Canc
264264
var selectColumns = new List<string>() { nameof(TableEntity.RowKey) };
265265
var tasks = new Task<bool>[]
266266
{
267-
_userTable.QueryAsync<TableEntity>(filter: filterString.ToString(), maxPerPage:1, select: selectColumns, cancellationToken).AnyAsync(cancellationToken),
267+
_userTable.QueryAsync<TableEntity>(filter: filterString.ToString(), maxPerPage:1, select: selectColumns, cancellationToken).AnyAsync(cancellationToken)
268+
#if NET10_0_OR_GREATER
269+
.AsTask()
270+
#endif
271+
,
268272
RoleExistsAsync(roleName!, cancellationToken)
273+
#if NET10_0_OR_GREATER
274+
.AsTask()
275+
#endif
269276
};
270277

271278
await Task.WhenAll(tasks).ConfigureAwait(false);
272279

273280
return tasks.All(t => t.Result);
274281
}
275282

283+
#if NET10_0_OR_GREATER
284+
/// <inheritdoc/>
285+
public ValueTask<bool> RoleExistsAsync(string roleName, CancellationToken cancellationToken = default)
286+
{
287+
return _roleTable.QueryAsync<TableEntity>(filter: BuildRoleQuery(roleName), maxPerPage: 1, select: [nameof(Model.IdentityRole.Name)], cancellationToken: cancellationToken).AnyAsync(cancellationToken);
288+
}
289+
#else
290+
276291
/// <inheritdoc/>
277292
public Task<bool> RoleExistsAsync(string roleName, CancellationToken cancellationToken = default)
278293
{
279294
return _roleTable.QueryAsync<TableEntity>(filter: BuildRoleQuery(roleName), maxPerPage: 1, select: [nameof(Model.IdentityRole.Name)], cancellationToken: cancellationToken).AnyAsync(cancellationToken);
280295
}
281296

297+
#endif
282298
/// <inheritdoc/>
283299
public virtual async Task RemoveFromRoleAsync(TUser user, string? roleName, CancellationToken cancellationToken = default)
284300
{
@@ -376,6 +392,9 @@ protected async Task<IEnumerable<TUser>> GetUserAggregateQueryAsync(IEnumerable<
376392
{
377393
return
378394
_userTable.QueryAsync<TableEntity>(filter: q, cancellationToken: cancellationToken).ToListAsync(cancellationToken)
395+
#if NET10_0_OR_GREATER
396+
.AsTask()
397+
#endif
379398
.ContinueWith((taskResults) =>
380399
{
381400
//ContinueWith returns completed task. Calling .Result is safe here.

src/ElCamino.Azure.Data.Tables/ElCamino.Azure.Data.Tables.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
<Copyright>Copyright © David Melendez, MIT License</Copyright>
66
<AssemblyTitle>Azure Table Storage Extensions</AssemblyTitle>
77
<Authors>David Melendez</Authors>
8-
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
9-
<LangVersion>13.0</LangVersion>
10-
<AssemblyName>ElCamino.Azure.Data.Tables</AssemblyName>
8+
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
9+
<LangVersion>14.0</LangVersion>
10+
<AssemblyName>ElCamino.Azure.Data.Tables</AssemblyName>
1111
<AssemblyOriginatorKeyFile>../../tools/key.snk</AssemblyOriginatorKeyFile>
1212
<SignAssembly>true</SignAssembly>
1313
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
@@ -20,7 +20,7 @@
2020
<RepositoryType>git</RepositoryType>
2121
<RepositoryUrl>https://github.com/dlmelendez/identityazuretable.git</RepositoryUrl>
2222
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
23-
<Version>9.0.5</Version>
23+
<Version>10.0</Version>
2424
<PackageProjectUrl>https://dlmelendez.github.io/identityazuretable</PackageProjectUrl>
2525
<!--<DebugType>Full</DebugType>-->
2626
<!-- DebugType Full is needed for test code coverage, but .nuget symbols doesn't like it-->

src/ElCamino.Azure.Data.Tables/EntityMapExtensions.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
using System.Reflection;
55
using System.Runtime.Serialization;
66

7+
#pragma warning disable IDE0130 // Namespace does not match folder structure
78
namespace Azure.Data.Tables
9+
#pragma warning restore IDE0130 // Namespace does not match folder structure
810
{
911
/// <summary>
1012
/// Extensions for mapping <see cref="TableEntity"/> to a class that implements <see cref="ITableEntity"/>
@@ -23,13 +25,9 @@ private static PropertyInfo[] GetProperties(Type type)
2325
if (type.FullName is not null)
2426
{
2527
return TypeProperties.GetOrAdd(type.FullName,
26-
(name) => type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty)
27-
.Where(w => w.GetCustomAttribute(typeof(IgnoreDataMemberAttribute)) == null)
28-
.ToArray());
28+
(name) => [.. type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty).Where(w => w.GetCustomAttribute<IgnoreDataMemberAttribute>() is null)]);
2929
}
30-
return type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty)
31-
.Where(w => w.GetCustomAttribute(typeof(IgnoreDataMemberAttribute)) == null)
32-
.ToArray();
30+
return [.. type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty).Where(w => w.GetCustomAttribute<IgnoreDataMemberAttribute>() is null)];
3331
}
3432

3533
/// <summary>

0 commit comments

Comments
 (0)