nbarbettini / little-aspnetcore-todo

Example project from The Little ASP.NET Core Book
http://littleasp.net/book
220 stars 93 forks source link

Difficulties in getting the example code in the book running in the Authorization part. #10

Open ghost opened 5 years ago

ghost commented 5 years ago

I have followed the book and it's very good. I have some difficulties in getting the code to work around the Authorization topic.

  1. ApplicationUser: I understand that I have to create this class by deriving it from IdentityUser (although I don't see it described anywhere in the book). Even when I created that class, it doesn't work.
  2. About the admin role, the example code might not be up to date to the latest Core API???

So for 1. I simply use IdentityUser and it works. for 2. I have replaced the services.AddIdentity.... in Startup.cs with this: services.AddDefaultIdentity() .AddRoles() .AddDefaultUI(UIFramework.Bootstrap4) .AddEntityFrameworkStores(); It works fine for me. Hope this helps.

ghost commented 5 years ago

Another thing...

in _Layout.cshtml @await Html.PartialAsync("_LoginPartial") @await Html.PartialAsync("_AdminActionsPartial")

This also doesn't work.

I have to do this instead:

                <partial name="_LoginPartial" />
                <partial name="_AdminActionsPartial" />
raquelmsmith commented 5 years ago

I am having difficulties with the authorization as well. To confirm / iterate on what @psaeui wrote, I also used <IdentityUser> in place of <ApplicationUser> to get things working.

Further, in Startup.cs I used the following:

services.AddDefaultIdentity<IdentityUser>()
        .AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

After these changes the DB was seeded. My test admin account shows up properly in the view that supposedly filters to user role.

However, I'm still having troubles getting the authorization for the ManageUsersController to work. When the line [Authorize(Roles = Constants.AdministratorRole)] is used above the class, my test administrator account is not able to access the page, even though the same constant is used to filter the user accounts in the DB and put them in the table as expected.

Here's what I see when I remove the [Authorize] line:

image

What am I missing here?

Here's my repo: https://github.com/raquelmsmith/dotnet-todo/tree/master/AspNetCoreTodo

Any help would be appreciated!

blueknightone commented 5 years ago

@raquelmsmith There is a known issue in dotnet 2.1 where AddDefaultIdentity<TUser>() does not enable roles by default. This has been fixed in 2.2. I just updated my project and everything works. You do need to either create your own ApplicationUser that inherits from IdentityUser or use IdentityUser directly.

erniker commented 5 years ago

Hi all, I have the same problem that @raquelmsmith, I even have created the ApplicationUser class, and it seem that works all except when you wanna entre in the ManagerUsers view as an admin. it's weird because Works the logic that show the link to the ManagerUsers pages if you are logged as an admin, but when you clicked on it, show the "Access denied" page... @blueknightone, I am updated my Project to .NET Core 2.2, with VS 2019, but still fail This is my repo: https://github.com/erniker/LearningASPNETCoreAndTests

It will be nice if someone could help me!

StevenDunn commented 4 years ago

While we're piling on, I'd like to add that I've been trying to figure out how to complete the authorization section for about 3 hours now. I'm new to Identity and this section doesn't work out of the box, unlike everything prior. This issue thread is the only thing that's been able to unblock me.

RayWangQvQ commented 4 years ago

Hi all, I have fixed this problem:

Keep using "ApplicationUser" image

Step 1: Go to "Startup.cs", change "services.AddDefaultIdentity()......" to "services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores() .AddDefaultTokenProviders();"

Step 2: Go to web page file "AspNetCoreTodo\Views\Shared_LoginPartial.cshtml" , there are 2 old "IdentityUser" in this file, change them to "ApplicationUser" like this: image

Step 3: Go to file "AspNetCoreTodo\Data\ApplicationDbContext", change "IdentityDbContext" to "IdentityDbContext" like this: image

Finally, run it again, then the DI will works.

Hopefully this helps u guys!

nicholaide commented 4 years ago

@RayWangQvQ helped a lot. The Logout does not work though: it just seems to refresh the page.