[API Proposal]: SignInManager.MakePasskeyCreationOptionsAsync and PasskeyHandler.MakeCreationOptionsAsync with TUser parameter
- Dominant language
- C#
- Stars
- 38.4k
- Forks
- 10.9k
- Avg merge
- 2d 6h
- Merged PRs (30d)
- 290
Description
## Background and Motivation
It is common to retrieve the user before calling `SignInManager.MakePasskeyCreationOptionsAsync`. Currently, this method does not provide a direct way to pass the already pre-fetched user instance as a parameter.
This means that `MakePasskeyCreationOptionsAsync` must retrieve the user again:
https://github.com/dotnet/aspnetcore/blob/9de03d56b6c24385d3ae1b99253982f4f3edbbb9/src/Identity/Core/src/PasskeyHandler.cs#L91
Introducing a new overload that accepts the user object could save a database round-trip when the user is already available before calling `MakePasskeyCreationOptionsAsync`.
## Proposed API
```diff
namespace Microsoft.AspNetCore.Identity;
public class SignInManager where TUser : class
{
public virtual async Task MakePasskeyCreationOptionsAsync(PasskeyUserEntity userEntity)
+ public virtual async Task MakePasskeyCreationOptionsAsync(TUser user);
}
public sealed class PasskeyHandler : IPasskeyHandler
where TUser : class
{
public async Task MakeCreationOptionsAsync(PasskeyUserEntity userEntity, HttpContext httpContext)
+ public async Task MakeCreationOptionsAsync(TUser user, HttpContext httpContext)
}
```
Maybe an additional argument for the display name is necessary as it exists today in PasskeyUserEntity?
https://github.com/dotnet/aspnetcore/blob/9de03d56b6c24385d3ae1b99253982f4f3edbbb9/src/Identity/Core/src/PasskeyUserEntity.cs#L21-L24
## Usage Examples
The proposed API can be used as follows:
```csharp
var user = await userManager.FindByIdAsync(userId);
var optionJson = await signInManager.MakePasskeyCreationOptionsAsync(user);
// Other operations using the user object
```
## Risks
Nothing I can see now.
cc @MackinnonBuck.
Contributor guide
Assessment
This issue has not been assessed yet.