VS 2017 ASP.NET Core Web Application and Individual User Accounts works but pages are non-existent - authentication

When I create a web project using "ASP.NET Core Web Application" / "Web Application" (non-MVC) / "Individual User Accounts"... I get the sample project with Register and Login buttons that show their respective pages when I click on them. HOWEVER... the very weird thing is if I search for "Create a new account" which is on the register page it's not found... and more... there is no AccountController in the Identity area or anywhere... so 1) the pages aren't anywhere in my solution folder and 2) how in the world are these pages showing up?!? I've tried on two different computers now. (using Core 2.1)
As an example this link works:
<a asp-area="Identity" asp-page="/Account/Login">Login</a>
and takes me to:
https://localhost:44300/Identity/Account/Login
and yet my folder structure (both in the solution and on disk) looks like this:

ASP.NET Core 2.1 with Identity automatically includes the "Default UI". It's a Razor Pages class library that's referenced via AddDefaultIdentity in Startup, which under the hood literally calls AddDefaultUI.
If you want the actual files in your project, you need to scaffold them in. Right click your project in the solution explorer and choose Add > New Scaffolded Item... Then, click the Identity listing on the left, and then the Add button. A new window will pop allowing you to select the pages you want included, your context, etc. Configure it how you like and go.
It's also worth noting, that as long as you use AddDefaultIdentity, the default UI is still included, which means you don't actually need all the scaffolded files if you want any of them. They'll essentially function as overrides. Anything specifically included in your project will be used, while anything that's missing will be pulled from the default UI.
This also means that if you want to do something like use standard controller actions and views instead of Razor Pages, the default UI will still be active, and take precedence. You have to use AddIdentity or AddIdentityCore instead of AddDefaultIdentity if you want the default UI off completely.

ASP.NET Core 2.1 introduced Razor UI in class libraries. Identity with it's UI is in nuget package.
The nice thing about this is you can now package UI with your libraries and then expose the UI for overriding.
This post describes how to override the UI. Essentially, you add the pages you want to override to your project to /Areas/Identity/Pages.... the easiest way currently is to run the scaffolder for identity and a visual walkthrough.

Related

ASP.NET Core 6 uses default identity pages instead existing ones

I have a .NET Core 5 web application with customized login and register pages, recently I updated the framework to .NET 6 and did no changes in code. It loads it's default Identity pages instead of existing ones. I don't want to load default identity pages and I want to use my existing pages. what's the problem.
Here is my current rout in Startup.cs
services.AddRazorPages().AddRazorPagesOptions(options => {
options.Conventions.AuthorizeAreaFolder("Admin", "/");
options.Conventions.AuthorizeAreaFolder("User", "/");
options.Conventions.AuthorizeAreaPage("Identity", "/account/register");
options.Conventions.AuthorizeAreaPage("Id", "/account/register");
});
In Visual Studio, right click anywhere in "Solution Explorer", then "Add>New Scaffolded Item", in the pop-up menu select "Identity", it will show a dialog with checkboxes, check the views you want to override (e.g. Account\Login, Account\Register), and select your data context class, then click [Add].
The views you've selected will be added to your solution under Areas\Identity\Pages... (e.g. Areas\Identity\Pages\Account\Login.cshtml), you may now override it with the old view you have.
see Scaffold Identity in ASP.NET Core projects

How to extract views from Razor class libraries?

When you add Identity to your ASP.NET Core applications, you can scaffold its Razor pages.
I am looking for a way to extract my views from a referenced RCL just like Identity.
I mean I want to create Area and related files (cshtml) to help developers to customize it (not a specific UI as you see in the above pic).
Do there exist any command-line tools to a way to extract Razor pages (.cshtml)?
I checked inside of a Razor class library with dotpeek there is no HTML resource, everything is class.
Any idea?

ASP.NET Core 2.1 Remove Identity Pages created using Scaffolding

I'm probably just missing a simple trick here, but I created the Identity framework in an ASP.NET Core project, created my own fields with my own classes, ran migrations, then once confirmed it was all working with the Default UI. It was working perfectly so went to customize the Identity UI so I could better control specific pages. Trouble was, thought I'd be adventurous and select every page to customize... yes dumb I know.. Now I've got some 80 pages or something that I no longer want.
I really only want to scaffold the registration and manage data pages, if I ran the Scaffolding again will that simply create new pages or fail because the pages already exist, or will it remove any pages that I don't select? I'm loathed to try it for fear of breaking something.
Perhaps it's down to manually deleting the pages I don't want, but will that cause issues with those pages that I haven't selected to customize. Seems great there's a scaffolding option to create the pages, but removing them... it's not so obvious...
For removing unwanted Identity Pages, you could delete them directly from your solution.
For Identity Razor page, if you add scaffold pages or manually create the razor pages with the corresponding name in Identity/Pages/Account, they will replace default Identity Razor page implementation. If there is no razor pages or you delete them, it will reuse default razor page from Razor library.

How to separate username and email on ASP.NET Core Identity

I'm so newbie in here as I try to learn this new stuff. But, I have a problem. On asp.net core identity, there's no AccountController (as many blog say it should be modified there), so how can I modify this? I'm so confused with this. Thank you.
The latest version of Identity has a default UI that's included programmatically, via AddDefaultIdentity (which calls AddDefaultUI under the hood). You can use the Identity scaffold to add just the parts you want to modify, which works like an overload: anything not explicitly included in your project falls back to the default UI version.
Right-click on your project in the Solution Explorer, go to "Add" and then "New Scaffolded Item..." On the left of the resulting window, there's a tab for "Identity", which has just one scaffold to choose from, "Identity". Click the "Add" button. This will get you yet another window, where you can now choose which items you want to scaffold into your project.
Be advised that Identity's default UI makes use of Razor Pages, now, so you still won't get an AccountController and such. However, you can simply include pages like Account\Register and Account\Login, which should be the two places you would need to make this change. Feel free to add and modify anything else you like as well.

ASP.NET MVC, razor view, how to modify html on the fly like Glimpse?

I'm upgrading from .NET 2.0 to MVC 4. Back in .NET 2.0 webform, we had to inject license information on the fly to the footer of the software by override the "Render" function in .aspx.cs page (using HtmlTextWriter), find a particular spot of the footer and then insert the license text info there.
The reason I don't want to directly put that in the viewstart page or any razor page themselves using HTMLhelper is because I don't want my customers to mess with it. So hard code is not an option.
I use Glimpse and I see Glimpse is enabled by adding a HTTPModule,etc in web.config and magically, an icon appears on my app. Something similar ?
Bottom line is, I need to hijack the finished HTML output, modify it and return the final result to client.
How do you do this in MVC? HttpModule?
Thanks!
Glimpse uses a feature of ASP.NET called a ResponseFilter to change the output HTML on the fly.
The ResponseFilter, in the case of Glimpse, is set inside the HttpModule - but it could be set anywhere.
Four Guys From Rolla has an old but still relevant article on how to create ResonseFilters.