Custom authorization issue

I'm testing some custom authorization without the default Entity Framework stuff. I have created an "ASP.NET Core Web App (Model-View-Controller)" project using "Authentication type" = "Individual Accounts". In Program.cs I have:

builder.Services.AddTransient<IUserStore<CustomIdentityUser>, CustomUserStore>();
builder.Services
    .AddDefaultIdentity<CustomIdentityUser>()
    .AddUserStore<CustomUserStore>();

For the moment CustomIdentityUser is just an empty class.

CustomUserStore looks like this:

public class CustomUserStore : IUserStore<CustomIdentityUser>
{
    public void Dispose()
    {
        GC.SuppressFinalize(this);
    }

    public Task<CustomIdentityUser> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken)
    {
        // Use dummy user for now
        //return new Task<CustomIdentityUser>(() => new CustomIdentityUser());
        return new Task<CustomIdentityUser>(() => { throw new Exception("THIS DOES NOT HAPPEN!"); });
    }
    ...

(All other methods from IUserStore currently throws NotImplementedException.)

If I start the application, go the the login page, enter some credentials and click login I can see that FindByNameAsync in CustomUserStore is called. Good, it seems the application actually uses my custom user store to look for the user whose name I just entered.

But that's where my luck ends. The user interface seems to be waiting for the login to complete. The Task returned from FindByNameAsync doesn't seem to be started at all...why? I think that the caller should get CustomIdentityUser instance from it (and then probably call GetPasswordHashAsync in CustomUserStore).

1 answer

  • answered 2022-05-06 20:59 Karim Fahmy

    why do you return new task in FindByNameAsync , also CustomUserStore

    should be for extending identity properties. in my opinion, creating a service for identity functionality and using dependency injection

    create an interface with the name IIdentity.cs

    public Task<IdentityResult> UpdateUserAsync(string id , UpdateUserVm updatedUser);
    

    then the implementation class IdentityService

    public class IdentityService : IIdentity
        {
            ...
            public async Task<IdentityResult> UpdateUserAsync(string id, UpdateUserVm updatedUser)
            {
                var currentUser = await _userManager.FindByIdAsync(id);
                currentUser.PhoneNumber = updatedUser.PhoneNumber;
                return currentUser != null ? await _userManager.UpdateAsync(currentUser) : IdentityResult.Failed();
            }
        }
    

    then register the service

    service.AddScoped<IIdentity, IdentityService>();
    

    in controller

    public class AccountController : Controller
        {
           private readonly IIdentity _identityService;
           public AccountController(IIdentity identityService) =>
                (_identityService) = (identityService);
      
            [HttpPost]
            public async Task<IActionResult> UpdateProfile(params)
            {
                ...
                await _identityService.UpdateUserAsync(params)
            }
        }
    

How many English words
do you know?
Test your English vocabulary size, and measure
how many words do you know
Online Test
Powered by Examplum