Sign in users using AspNetCore.Identity
(.NET 8 RC2
) in a Blazor Server app using cookie authentication and call a protected API using API Key authentication.
Run both of the projects, login using Username: [email protected]
and Password: Password123!
.
Navigate to Weather page and you can see the weather data being fetched from a secured API:
![image](https://private-user-images.githubusercontent.com/30603497/274387208-84982d65-7bfa-4d33-b749-3fcb03b3688f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzQzODcyMDgtODQ5ODJkNjUtN2JmYS00ZDMzLWI3NDktM2ZjYjAzYjM2ODhmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJjNzEwY2JlMmYyMmY2N2YxMTFiMWUzMzUzNzBlZmMxNDUwOTU3NGM5YTMyZDNlOTEwZTkwYzRmZjUxMjI5MmUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.cLJTtO-t_s6KD0rT26eHaDo8924zBO4fKsSfLN7rpx8)
- Choosing an Identity Solution: Identity vs OIDC (Read it!)
- Blazor OIDC with Aspire Example
- ASP.NET Core Identity system is designed to authenticate a single web application
-
Installed ef tool
dotnet tool update --global dotnet-ef --prerelease
-
I used Rider to create the project:
Hit Create
-
I ran the migrations
dotnet ef database update
-
Added some missing middleware not included in the template
-
Launched the app, created a new user and signed right in.
-
I used Rider to create the project
-
Added API Key authentication to it. Take a look at the code to see how I implemented it. I referenced mostly this and this.
-
The Logout doesn't work:
Click
Logout
on the bottom left.You'll get this error and the user will be never logged out.
-
Lot of errors show up. Could be a bug in Rider. (The app runs fine though).
In the client project, I setup the ProtectedWebAPI Url and ApiKey in appsettings.json and used that info in Program.cs to call the API.
appsettings.json:
![image](https://private-user-images.githubusercontent.com/30603497/274390708-f8a99aa4-6768-447b-bc4c-e9752d1e896b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzQzOTA3MDgtZjhhOTlhYTQtNjc2OC00NDdiLWJjNGMtZTk3NTJkMWU4OTZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVmN2RiYjFmZDY5ZWUzMThiODAzY2FkYTNiNTAwYjBkNjY0OGU5ZjNlYzY0MmQwOTBhNmQ2YWZhMzQwZWJhM2YmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.mHhXmXztNc6ReNLYmVy9lLbjBKUZxDmQjtiDgs-x_eo)
Program.cs
![image](https://private-user-images.githubusercontent.com/30603497/274390779-81f7e84a-4360-45a1-90d7-360b28c003b6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzQzOTA3NzktODFmN2U4NGEtNDM2MC00NWExLTkwZDctMzYwYjI4YzAwM2I2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTljNGE4MWIyMWI2OGVhZjE3N2ZlYmM0ZDhjNWQ2NmNkYjQ4MmEyZTllY2EzMjRmMzAzYTM3MWJhMzFhYzkyY2MmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.sHZW_yCk-JvZUO-3U_fhRu58GIOq4sETAxhGqHAUgZY)
WeatherForecastService.cs:
![image](https://private-user-images.githubusercontent.com/30603497/274390998-b518a68a-a07f-417b-a9fb-dac19ea7e94f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzQzOTA5OTgtYjUxOGE2OGEtYTA3Zi00MTdiLWE5ZmItZGFjMTllYTdlOTRmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWNlMWFkOWNiZWNiODcxOTZlNDVhMThjNWE3MTYyMjkwY2JjMzQzM2FkMThiZGNiMTYzMzNhNDg0MmZiOTNkZTAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.oyNObuu35Af0jG4RTYtU1Q-01L9nCjjXEqaUdsMYYHA)
Add Microsoft Authentication to your app. Reference.
![image](https://private-user-images.githubusercontent.com/30603497/275102431-ecb5b07c-63d1-4dd0-9eff-2bf0faa4eb42.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMDI0MzEtZWNiNWIwN2MtNjNkMS00ZGQwLTllZmYtMmJmMGZhYTRlYjQyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTljYWIxNDkyM2VmYzk3OWQyZmJkNmFhODIxZmVlNTM1MzFmOTMwMzVlYjA3Mjg3OGJjMWU4MTRjMmFiNzY4MTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.njh5oXekRdq3fwK3mE-f7YaS0mVqeObwOc5FDaT4Rwk)
Store the secret in user-secrets
. Store ClientId in appsettings.json.
![image](https://private-user-images.githubusercontent.com/30603497/275104562-7fe8b6ed-1e3e-4ee6-96a1-b3a1a343b1b2.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMDQ1NjItN2ZlOGI2ZWQtMWUzZS00ZWU2LTk2YTEtYjNhMWEzNDNiMWIyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThlOGEzYTE0YjlhNDg1OGU0MzdiOGJiYTcxM2ViZDA1YWUxMjcxNjY1ZWFjZTc3ZDg2MDc0Zjk2ZGRhY2EyN2EmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.2_xdIS7OTW4cPit3F_Q47WVYTiF1tJ0A7tamfnpBel0)
![image](https://private-user-images.githubusercontent.com/30603497/275106139-076100a7-876b-43aa-9757-09deac4c11ed.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMDYxMzktMDc2MTAwYTctODc2Yi00M2FhLTk3NTctMDlkZWFjNGMxMWVkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY4MjRiMDkyMjEzY2IzMTg5MmNhYTk4NjQzZjdiZGVkMmRhMTAxNjY3YzMzMGRmMWI4ODVkZjI0NzUxY2VjM2ImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CxMI14W5j4XOS5L515Oltrr4SLohPIDu5PWe6NZn7O4)
![image](https://private-user-images.githubusercontent.com/30603497/275107886-930f4184-26f4-4fdb-a6e1-ca7e84790eb8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMDc4ODYtOTMwZjQxODQtMjZmNC00ZmRiLWE2ZTEtY2E3ZTg0NzkwZWI4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWMwNDQxMDM4ZTA3MTJmMDBhYWEyNTgyNDM1N2Q2NTQzZjQ4N2M2YjliODM0MWFjN2FhNDI4MDZmZjc0ZmJkOWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Qv2H5E7xqhr_cZ1lfBZKX7Zejgb-4DM1AyFH7PcNCUU)
The services are setup at the last line of MicrosoftAccountExtensions
where there's a call to .AddOAuth
.
Here you can see the MicrosoftAccountHandler
.
![image](https://private-user-images.githubusercontent.com/30603497/275283214-f93e19a0-e5b7-4380-8497-9a75b7e7c088.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODMyMTQtZjkzZTE5YTAtZTViNy00MzgwLTg0OTctOWE3NWI3ZTdjMDg4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdmMjliMzM0ODVjMTg2MjY3MmM5MmViOTI4OWNlODg5YzM1OWIwODkzZTI1ZTQ4ZmQ2MGM4ZDNmZTM0YmFmYzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.8_iNj7YIFWTWRANrfzIxnAS65UzBRqOpmfUTXi-wHBQ)
To see how the above claims were fetched, you can see it in the MicrosoftAccountOptions
class added from the package. Here you can see that it had asked for the scope of user.read
and Claims were mapped this way:
![image](https://private-user-images.githubusercontent.com/30603497/275279473-82aa93ac-f81f-4c36-988e-9c9228c2512c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyNzk0NzMtODJhYTkzYWMtZjgxZi00YzM2LTk4OGUtOWM5MjI4YzI1MTJjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWRkMTdiZGJiYWFjMTgzYTdjN2QwYTk4NDNjOTA0NDYyNTYwNmRhODcxNjEwYzc5YmMwNWIxMTBjNDIwMjEwZmEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.OnKx57GpySTtUs_y4Sca7Vrk9V4HGkWucImM6QJhSTg)
Command + Click on .AddMicrosoftAccount
method:
![image](https://private-user-images.githubusercontent.com/30603497/275282669-ef6ff0ff-9b6b-43e0-a39d-28ea90500e8f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODI2NjktZWY2ZmYwZmYtOWI2Yi00M2UwLWEzOWQtMjhlYTkwNTAwZThmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZkZjNmY2Y1N2Q0NDUwZDIwMzU4NmY5NWZkNzhiZGFmZDhlNTc4YTQ3NzhhMzllMjBkM2Y2N2FhMDdmMjdlNjUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CcMozMiGNG-mryQMb8d6MnCMeIvGSGbZEijsZJO45Tw)
Check what AuthenticationScheme
was used:
![image](https://private-user-images.githubusercontent.com/30603497/275282710-674d6247-cb1c-4e43-9816-e4d125b7a792.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODI3MTAtNjc0ZDYyNDctY2IxYy00ZTQzLTk4MTYtZTRkMTI1YjdhNzkyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM1Yjk4NTkyNTI4NTYzYzZhNWNjMmVmNGM3NTQ1ZDI1OWY5NDJjYWMwNjVkMzNkNGQ0MDk0Y2MxNGNjMzBjYzUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.XFViDaa8YF2WlvF1mt7-cVEDtUlS15YuWiGwJihXSsU)
By going to MicrosoftAccountDefaults
:
![image](https://private-user-images.githubusercontent.com/30603497/275282759-fdbe90fb-286c-46c1-8d2b-0e07f4015a49.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODI3NTktZmRiZTkwZmItMjg2Yy00NmMxLThkMmItMGUwN2Y0MDE1YTQ5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZhNDgxZTZkMzg0ZWM0YTI4MGJmZjdhMWMyMjliNGI5NjMzNTFkYTViYzg1MWVjMzI1MDkzNmY0ZDg3ZGU0NzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.uR0wxdO923UVof-y9NCab5lsbgO79g0bEPRC9xUYIqU)
You can see AuthenticationScheme
used was "Microsoft"
and also see the 3 most important endpoints in OAuth: AuthorizationEndpoint
, TokenEndpoint
and UserInformationEndpoint
.
Add GitHub authentication to your app. Reference.
![image](https://private-user-images.githubusercontent.com/30603497/275110918-b0a2fc52-b8a5-4e63-8b20-a18944848b64.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMTA5MTgtYjBhMmZjNTItYjhhNS00ZTYzLThiMjAtYTE4OTQ0ODQ4YjY0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTEwZThjMDg4MWM3ZjZjYWY2YjMwYjQ4YWVlZjNiYjlhYmFjOGJjZDFlY2MxNWQ2OTg5ZmExZTE3NDFiYjNiODUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ymn1bL-TREx123ysa6wFQNq_rwHoC6Ivk0_9ux9wqTQ)
Grab clientid
and clientsecret
.
Go to GitHub's OAuth docs to find 3 important endpoints as part of OAuth: Authorize, Token and User endpoints.Reference.
-
Authorize
After the user is logged in, GitHub sends us the one time code (that can be used to exchange for a token) to the redirect url that we set during registration.
https://localhost:7074/signin-github
-
Token
-
User Information endpoint to get user info
![image](https://private-user-images.githubusercontent.com/30603497/275343796-4dbaf4b6-b43b-4412-9be3-bd09e6dd3089.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDM3OTYtNGRiYWY0YjYtYjQzYi00NDEyLTliZTMtYmQwOWU2ZGQzMDg5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM2MTFlOTU4MGM1NTEyN2NkNDYyZTA3YjJhYzFlNzJhN2EyNjRlMjA0ODZhODkxYzkyNTJiMjA0YjcxNTc0MTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hArcLnmUNciDs8aDcZIe-doPwbWx9fGm_BS5r3SX7P8)
Just look at the code.
AuthN and AuthZ Basics Reference.
app.UseRouting()
: URL is matched to the endpoint.
app.UseEndpoints()
: Actual endpoints are registered.
![image](https://private-user-images.githubusercontent.com/30603497/275695317-a605b6d9-173e-41e6-b0c2-1fa166347ebc.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzU2OTUzMTctYTYwNWI2ZDktMTczZS00MWU2LWIwYzItMWZhMTY2MzQ3ZWJjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZkMTQ4NTdkZGY0MTI5MWJmMGNiNTFkZTQ4NzkwNDEwNjMzNzJiZWZjNzU5MzZlZGIzOTg3N2FlM2VlMWQ0ZjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.VDZo4IqVSLe_5roiBpxEhmZNgxSu1xD73jJsd_pWH_Q)
This is what cookie contains
![image](https://private-user-images.githubusercontent.com/30603497/275687860-63622179-0729-4005-94b2-bb182dcc9c6d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzU2ODc4NjAtNjM2MjIxNzktMDcyOS00MDA1LTk0YjItYmIxODJkY2M5YzZkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWRlZmQ3NmJiYWU4OTNiNTk1OTQ5Y2YxNjdmNjM5MjJhOGMzM2JlNDQ2MGI2ZDFhZmQ3OTFhOGRlNTE4ZGUxYzgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.tOpsJACpHNcS_4nG_cUlUtN5KBv9yNjCuXG6AnVhnrA)
You can retrieve those Items
from AuthenticateResult
.AuthenticationProperties
.Items
:
![image](https://private-user-images.githubusercontent.com/30603497/278843243-6fba6417-9d36-46c3-aca6-1e37ada61703.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDMyNDMtNmZiYTY0MTctOWQzNi00NmMzLWFjYTYtMWUzN2FkYTYxNzAzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWUyNGUzMmExMDUxNWMxMmJlMDM3ODVlNWY5YjIzMDkwNGFkMjVhYzIxZGU5MmM0ZjUyMWViMmVkYTY4YWM2NWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.fP_L-ICrB2nlqEmTm0Q0f8y-sZ4uyDrxsaxhMPrcKHM)
It is handled by RemoteAuthenticationHandler
.
![image](https://private-user-images.githubusercontent.com/30603497/275708723-9560406a-76b6-4b84-8631-3cdf9938810c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzU3MDg3MjMtOTU2MDQwNmEtNzZiNi00Yjg0LTg2MzEtM2NkZjk5Mzg4MTBjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA4YmI1NDgzNTliNWViZGUxNmVhMzRiY2ZjMDY4NDEzNDA5YzlhMjU0MmE4YTllYmFhNTc0Y2MwMDA1YjI3MmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.HMOTgvACXolt4cbMJpZYJNZZyrvF6FCTfhmfmzR2s0c)
Google, Facebook, Twitter, Microsoft Account etc
OpenID connect, WS-Federation, SAML etc.
Every time you navigate to ANY page in the app, the Authentication
middleware runs (It's middleware duh!).
It's the bit that's inside app.UseAuthentication
:
![image](https://private-user-images.githubusercontent.com/30603497/275292859-8c89eac8-2b5f-4ae0-8840-94da5bd0e3bd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTI4NTktOGM4OWVhYzgtMmI1Zi00YWUwLTg4NDAtOTRkYTViZDBlM2JkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWRmMDI5MzY1OGUxNTIwMmVhODc1YjMwY2QwMWJiZDUwMzBiMmQyMjNmMDI3NDg2YTY5MzYyNGJiZDhjNzAxNTAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.gifrlbOEe2rF8M56dyf12nRMOyjTLys-H2EzEBuYK1Q)
See how IAuthenticationHandler
looks like:
![image](https://private-user-images.githubusercontent.com/30603497/275287437-01b3b931-2628-4f28-a25a-3143f2f34503.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODc0MzctMDFiM2I5MzEtMjYyOC00ZjI4LWEyNWEtMzE0M2YyZjM0NTAzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVhMmNlNzFhZWFmZTM2ODM2YzE3ZjE5ODkyYmIzNTY0OTU0MzE0NmQzYzQyYTU3MThhNzUzYTc3ZjRkM2QwNmQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.La5X2z50vjto0knMPhJkHRZBWyTUJqo_cBMbghP9Xnk)
See how IAuthenticationRequestHandler
looks like (this is relevant in var handler = await handlers.GetHandlerAsync(context, scheme.Name) as IAuthenticationRequestHandler;
line shown below):
![image](https://private-user-images.githubusercontent.com/30603497/275344481-958e94de-0abc-4d23-90e8-4272edde5a6a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDQ0ODEtOTU4ZTk0ZGUtMGFiYy00ZDIzLTkwZTgtNDI3MmVkZGU1YTZhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE2MjAwMDBkMjkwZTA2NTVlOWNjYWZjNjJiYjBmYjgxYzJjZmE1YzQzNWU4NDQ1NzZmYjhjMDNlZjNhMDAwMzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.M-DdYQRzUmLI9G6-SCYVErBqxDI-ND3FvuZnASDF3Os)
I have setup Microsoft and Github (OAuth) authentication, so I've got 2 handlers now:
![image](https://private-user-images.githubusercontent.com/30603497/275292903-99bbc7d8-27c2-4c5f-87cd-72c7fe71ef84.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTI5MDMtOTliYmM3ZDgtMjdjMi00YzVmLTg3Y2QtNzJjN2ZlNzFlZjg0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZmY2QxMzY4MDIzNTlkYzE1Y2ZjYmEyMjNiODBlNjE3OTg5ZjU0MDVhODQ4OTEzYTA4ODM5MTg4NzA1OWJkNjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.dPu7G9ttgHSbvDIeVUb5ql8ukKCvyf4fiaBi_UDbg9E)
Those 2 handlers come from the service registration section:
![image](https://private-user-images.githubusercontent.com/30603497/275292937-dac16155-7c29-413c-8f5b-9dac327dc2de.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTI5MzctZGFjMTYxNTUtN2MyOS00MTNjLThmNWItOWRhYzMyN2RjMmRlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBhYWNhNzE5OGJmYWZlYmQ3NzBhMmZjZGM5OGFjYmQ2NjgwNDg0Y2VkOTMxYmUxYmY2OTUwOTE4OWQ5ZTEzNjYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.9jAseVjxw_ZYB8eVeEkAH_Ulp9cD5JdZDIEYfi1AbYE)
The middleware determines if it should handle auth request on those handlers (using IAuthenticationRequestHandler.HandleRequestAsync
).
![image](https://private-user-images.githubusercontent.com/30603497/275338830-6daaf501-1804-4f26-807c-5eee61705fe1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzMzg4MzAtNmRhYWY1MDEtMTgwNC00ZjI2LTgwN2MtNWVlZTYxNzA1ZmUxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFhZDBmNjI5ODZkOWYyYjJmYjZhZTMzMDU0YTUyNjg4OGY4NDg4ZmJlNDA1MzJkYTNhN2I2OThjYjkwNjlmNWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.x1kd0Kd9qvnjZGJuOX0qmjhgD2onMM41PDYY5jt9DLw)
For eg: For my case (Microsoft, GitHub handlers), it's determined by HandleRequestAsync()
in RemoteAuthenticationHandler.cs
:
![image](https://private-user-images.githubusercontent.com/30603497/275293117-c2844e22-93ec-474c-9b5e-fed5a897d81b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTMxMTctYzI4NDRlMjItOTNlYy00NzRjLTliNWUtZmVkNWE4OTdkODFiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlhMTg1MWU4NDhjZmJjYjEwMWM4YzViOGUyZDg0YzI4MDZkZjZkYjdhZmVkOTc2N2E3OGM2MDA1NDIwODFhMWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CeSMrIB5ctk51gpt8Q6ctp2Nt2NZpM-xDSYTF2vC_Lc)
Since, I'm going to "/counter" page now, the HandleRequestAsync
method short circuits.
Default AuthenticationScheme is whatever I setup in .AddAuthentication
:
![image](https://private-user-images.githubusercontent.com/30603497/275293249-6019d4bb-c0a0-430b-8bcf-bc7bee007bbd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTMyNDktNjAxOWQ0YmItYzBhMC00MzBiLThiY2YtYmM3YmVlMDA3YmJkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWFkYmVmMWViYmI1MTU1OTQwNjYyOTIyNjM0ZWZjZjQxNWJiOTc2YzBkZGYxMTIzMGRlNmE1OWVlY2IxM2RhMjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hRFW4WjvKckPXZ_wpIqvh85cdlTfUxPWncEoA__NSmU)
Using the default authentication scheme, it tries to authenticate the current request. If it succeeds, you get .User
in the HttpContext.
![image](https://private-user-images.githubusercontent.com/30603497/275293783-e018d9a7-88cd-4443-bd18-b77d69da11bd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTM3ODMtZTAxOGQ5YTctODhjZC00NDQzLWJkMTgtYjc3ZDY5ZGExMWJkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI0ZWQ0MzYzYzZjMDg1ZjM4MGEzNjQzODM3YzRkMTFkZGQ2OWRlYzcxOWM0NGFmN2NhOTZkYmEyYjQyZmFiZTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3bBTyE9Bt6koSWesBri58BGglrNAz8UFx3Vo_51R51s)
To view the handler for your default auth scheme, navigate from here:
![image](https://private-user-images.githubusercontent.com/30603497/275341892-c4d0281d-ee29-4886-90ef-f923537385f6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDE4OTItYzRkMDI4MWQtZWUyOS00ODg2LTkwZWYtZjkyMzUzNzM4NWY2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQzNzgxZTI0ZTUwNzgwYjNhOTIyNmM5NWM2NTZhMDJjODljNmE4ZjA5ZmQ2YzQ3Yjc4NjBjY2UzYTE4MGQyYmMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.TOwJ6iPo-kRB8SLPEtFpDco-T_osS2gBqln63oQTdms)
To here:
![image](https://private-user-images.githubusercontent.com/30603497/275341922-a358222d-cc17-4d80-9a1f-016f35cc496e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDE5MjItYTM1ODIyMmQtY2MxNy00ZDgwLTlhMWYtMDE2ZjM1Y2M0OTZlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWMyMDZmYWVjOTJlMTM4OTM4ODUyZWQ5M2I0NGM0ODNhMGFkNmQyNzAyNTAyNTJhN2M5ZWZlOGU3N2Y4ZjQ4ZmQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.K_C7NVahd9h-Hdh7xO_rC6hN4rif-Msr0m0BFClNWoo)
To here:
![image](https://private-user-images.githubusercontent.com/30603497/275341951-d94e3e07-8435-4c39-83e9-70ef66b7756b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDE5NTEtZDk0ZTNlMDctODQzNS00YzM5LTgzZTktNzBlZjY2Yjc3NTZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTAzNjczOTFjM2NhYzhjOWVjNGNiODc5ZTZjNGFkMmQ5NGZmYzYyNjU1MjkxNjA3OTU4OGY0NjhhNDU4ZTFlNzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.yAH6Ysr6WQK2UH5-fPXYlGzYPR6HyNufoxqO5vZ3RbM)
To here:
![image](https://private-user-images.githubusercontent.com/30603497/275341977-3e122c7a-0322-4b8b-8bd0-042a56f09b2b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDE5NzctM2UxMjJjN2EtMDMyMi00YjhiLThiZDAtMDQyYTU2ZjA5YjJiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWRlNDRiYTk0NTZjMDFjM2RkODg2Zjc3MjcwNWUzNTQ5NmEwYWFjNWRkZWVmOWY5YTMyNTY4ZmY0MTcxZWNjMzkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.plflSz7lyJllVQD2g13I17dRjC_96nQgJuSaMrtNBFo)
To finally here:
![image](https://private-user-images.githubusercontent.com/30603497/275342011-ec95dcf2-9209-4801-a89d-2aab2f50428c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDIwMTEtZWM5NWRjZjItOTIwOS00ODAxLWE4OWQtMmFhYjJmNTA0MjhjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIzZWE5Y2VlMTA2MDUxY2MwMTViZWNmZGZkMGUwODE3ZGRjNTA4YWI3N2NlMWFhMjY2NWY3ZDMwODVjMDMzNGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.l3c3gMqGPTdMwvcKeasEwu7VrB-aNv1qDDkq2jA3zR0)
Here you can see that this service has Schemes, Handlers etc. to authenticate a request.
Now let's get back to see how this line in AuthenticationMiddleware.cs
executes:
![image](https://private-user-images.githubusercontent.com/30603497/275342128-230d9e13-1e78-4892-9ff3-8877a10b574b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDIxMjgtMjMwZDllMTMtMWU3OC00ODkyLTlmZjMtODg3N2ExMGI1NzRiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE4YzZhN2Y3MjQ1MGRmNDM0YWYyNjYzMGM2MzM2YTUwZjIwZmU5YzNjYWJjZWZhZWUzYWMwOWQ2NjdkZDA2MTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.19yB31mMYTFGVzqSmi7mwcBi-N6LXJl-t-YhBB43rJM)
It just calls .AuthenticateAsync
on the AuthenticationService
:
![image](https://private-user-images.githubusercontent.com/30603497/275342149-c11a1bbe-131d-4777-98b3-9910f34cdfba.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDIxNDktYzExYTFiYmUtMTMxZC00Nzc3LTk4YjMtOTkxMGYzNGNkZmJhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTcwZTYwMjFjYWEwNWE4MDI3OTZlMmQwNzI0MTVmZDUxNzMwNjcxMWQyNmUwNzAyMTMwN2I1YTBmM2MwYWJhNjEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CQJoyt-6hjWlREYWBB4PbFYgxVaPzvV2RjPIMLVeJ5I)
See the SchemeName and Handler:
![image](https://private-user-images.githubusercontent.com/30603497/275342609-d7220f34-d95e-437b-8fe6-ed7c2be51555.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDI2MDktZDcyMjBmMzQtZDk1ZS00MzdiLThmZTYtZWQ3YzJiZTUxNTU1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ3OTk4NjkzNjY0YzYwYTM5MjcwOWRhMjE3Mzc4MWQ4MWMxN2M4OGRlMjViNTQ3NWNjZDAxNDBjZmI4MzJiNTkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.n-8ZLKVgW66mTAKXyI08LNNhdNzJtfchtVjpupXx_-Q)
Now we get into AuthenticateService
's AuthenticateAsync
method:
![image](https://private-user-images.githubusercontent.com/30603497/275342712-5b4e3109-3aac-4030-b583-129f18ab6295.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDI3MTItNWI0ZTMxMDktM2FhYy00MDMwLWI1ODMtMTI5ZjE4YWI2Mjk1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBkNDgzM2YxMTRhZDlhNzkxZWY4ZmRiNDljMDRlMThkNmE1Y2ExYjQxZjQwZGJhZjAxZGRhNDdlNzE2Yjg4NjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.SszxUHP6UtmEpv7kRTACY_wFkwwwb4AEn6mEXkaDSbo)
Then into AuthenticationHandler
's AuthenticateAsync
method:
![image](https://private-user-images.githubusercontent.com/30603497/275342965-360f549f-e8a6-400e-aebc-346496e29b9f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDI5NjUtMzYwZjU0OWYtZThhNi00MDBlLWFlYmMtMzQ2NDk2ZTI5YjlmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI1OWNkNzMyZmE3NGIwYjQ2Y2Q3MmVmOWFkYjczMTliYmEzMDhlZDQzODAzZmM3ZjM4OGEwNTE4NTA3ZGE5Y2MmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.iTjKyI_W2LaDZ2pP6rCca6NvhnfqtBrbdI30RfZzPko)
Then into AuthenticationHandler
's HandleAuthenticateOnceAsync
method:
![image](https://private-user-images.githubusercontent.com/30603497/275343069-2d5fb0e8-a0ff-4826-b38a-0d44b87f0f67.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDMwNjktMmQ1ZmIwZTgtYTBmZi00ODI2LWIzOGEtMGQ0NGI4N2YwZjY3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWNlZWViZDJkMmUxNmE0OWU0NGE4ZTA5NzcxNzM0ZTkwZWQ5MDUyZDA3NTE1MmZhNTMyNjVjMzc0MzVlZmIyM2QmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.7Y6NrM6l7GnkWt8vvLKbflEjSoAmqbQOmDaM02bmofA)
Then into AuthenticationHandler
's HandleAuthenticateAsync
method:
![image](https://private-user-images.githubusercontent.com/30603497/275343145-00c8d5d7-062c-4266-8fb9-4d66c5c5e52d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDMxNDUtMDBjOGQ1ZDctMDYyYy00MjY2LThmYjktNGQ2NmM1YzVlNTJkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ5NWUzYjNhZjkwZTEzMzI2MjYwMTUwOTNjMzNlYTJjNmFiOTE0Y2JhYjZlMTFmNWFhYzBmZGQ4OTA3NDBiNWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.2xTfsZ10C7Wqa5e5-tQ8z3eiesYTmgwd0RriigdwkzI)
It's an abstract method that is implemented in a class that derives it, CookieAuthenticationHandler
in this case, so we end up here:
![image](https://private-user-images.githubusercontent.com/30603497/275343291-b91dede3-889a-431c-b586-1de877bb1ad8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDMyOTEtYjkxZGVkZTMtODg5YS00MzFjLWI1ODYtMWRlODc3YmIxYWQ4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJkYmFmYjdmODAxZDBmYzQ2NTkwMzE5ZTE5YTdiZGVhZjY4NzA3ZGZlNzY2YTQxNGFjNWNiNWY5YjI2ZjE3ZDUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.AqlsaS1kr6rL-_bp3b7_am2-UIHEhYzEtPBpw4olvnQ)
Then we finally get this result:
![image](https://private-user-images.githubusercontent.com/30603497/275343415-cf863f30-b60b-4605-809f-c653cab8b4da.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDM0MTUtY2Y4NjNmMzAtYjYwYi00NjA1LTgwOWYtYzY1M2NhYjhiNGRhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlkOTNjYzVjNDM2ZWVmMmExMjFiYTRhNTQ3Y2Q4YjhhNTYxZDNlZjUxMjNmYmRiYTJlNWYzMzlkNDA2NzQ4M2ImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Wcbyl7bldGoqbfEJuCNjpn35X_ncjNkfa_Yn-T_LSDQ)
The schemes the app has:
![image](https://private-user-images.githubusercontent.com/30603497/277503300-36b17dc7-1a95-4cbe-98a7-b5bfd6e140bf.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDMzMDAtMzZiMTdkYzctMWE5NS00Y2JlLTk4YTctYjViZmQ2ZTE0MGJmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWNjZWY4NmQ4NTE0YTgyYWIzODIxZTFkMDhhZTRlYTdjZDRmY2ZhNDk0YjA2ZDgzNDQ3NDhhZWYwMDE1ZWJhNjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.6wx1GZZOOzAHDqR27_O4pahKO4x2YJllL3djiKD2kpo)
ExternalLoginPicker.razor
shows the external logins:
![image](https://private-user-images.githubusercontent.com/30603497/277503648-c6b90469-acf2-4317-b0d1-1e44ca7ce5ab.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDM2NDgtYzZiOTA0NjktYWNmMi00MzE3LWIwZDEtMWU0NGNhN2NlNWFiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRkNjU4OTBlNjY5OTU2MzI3NWEwYmJmZGI3ZTU4MDUyYzI5ZDZhYmU2MTBlNmFkNjNiN2Y5N2JkMmY5MjdiZDAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.OOHqBS-BTeQpou26vXkCudpKDr2Kbz8N9NQeVbOxyDI)
![image](https://private-user-images.githubusercontent.com/30603497/275347776-917e57cb-8608-433d-b6d0-3de029224c29.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDc3NzYtOTE3ZTU3Y2ItODYwOC00MzNkLWI2ZDAtM2RlMDI5MjI0YzI5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUxZWJiNTU5Yzc2YTk0YTUyNzVjNjExNWQyYzMxYmYyYjlhNzg4NDNiZTgzNWMwM2JkN2NlYTAyNzRlOGVhNmEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.YxSGbFm5P-cXxQa_JfW42GWu2-WNnkZU3rBmv13Gabk)
This will call the POST endpoint:
![image](https://private-user-images.githubusercontent.com/30603497/277504359-9b59d135-20b7-4400-bce6-8f917add9f66.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDQzNTktOWI1OWQxMzUtMjBiNy00NDAwLWJjZTYtOGY5MTdhZGQ5ZjY2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWJjMWVkZGI1OGZlYTAwODk1MTVmZmNlNDQ0ZGM5NzgwM2NkZjQ1YjhlNDVhZTYwNzNjMTgxNjRhNTU0YjRhOTAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.tQEHut-hPmJZTWaDIYxz7OKbLWswqsO9OM5RQnoNR4I)
/Account/PerformExternalLogin
in Identity/Extensions/IdentityComponentsEndpointRouteBuilderExtensions.cs
This is where I want GitHub to redirect me after completing authentication:
![image](https://private-user-images.githubusercontent.com/30603497/277505425-183c5061-7d9e-4d91-923c-f2ac911bb891.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDU0MjUtMTgzYzUwNjEtN2Q5ZS00ZDkxLTkyM2MtZjJhYzkxMWJiODkxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdhZjdkMTgzZGNmZGIxNDc3OTYxMzVjMDkxNDI1Yjg3YWY4N2NjZmY5YjM3YzVhMjFhMWYxOWI4Yjg0ODYxMzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.9geWQDuvaAFWJoNRiAWAPnFWdTHK7Z4N85EEvsP6aYg)
Use properties
to preserve data between Challenge phase and Callback phase
![image](https://private-user-images.githubusercontent.com/30603497/277505663-1d5b1e07-eecd-47b2-84b8-7b2687c7f4f8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDU2NjMtMWQ1YjFlMDctZWVjZC00N2IyLTg0YjgtN2IyNjg3YzdmNGY4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMwNGRiYThiOTEzZTNiZjJhN2JkZDY3ZTVlZWM3ZjFkMjE4ODE2MzJlNDZjNTc2YTI1ODlmZTU0MTdhNTI5MmMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.7VPsfk-r8kQV4x9MSCtZHb_Z-YPSVYSZvVgyiprPuqc)
![image](https://private-user-images.githubusercontent.com/30603497/277505874-6636b1d2-e371-4546-98b5-560ece855a0b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDU4NzQtNjYzNmIxZDItZTM3MS00NTQ2LTk4YjUtNTYwZWNlODU1YTBiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTcwOTAxNjExN2RhMmRmMWU1OTc3ZWViZjYyOGU0YzM4MWEwMTc0MDEwNjAxZTUzMWQwYjJlNTZlZjdhODk4N2UmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.t8k561hChQrgayHbQGVO6iGdoU9TEqxO2SyO9AkYuNE)
Now we're in OAuthHandler.cs
![image](https://private-user-images.githubusercontent.com/30603497/277506480-e614aba9-b0ea-41d3-8414-216683697b1a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDY0ODAtZTYxNGFiYTktYjBlYS00MWQzLTg0MTQtMjE2NjgzNjk3YjFhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWUxNGRiMmY3OWIyZjkzZDRmNTE0YjZjMzFjMzJiMmFhZDhiNmQ4YTc5M2M1YTMzYWE1MmQ1Y2UwN2U4Mjc3ZjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.oD2ri04skBe2r4667mVgGKth0eDIb4eCKljeXUqUzM0)
![image](https://private-user-images.githubusercontent.com/30603497/277506580-cb1144bd-c697-40fb-951d-f6d7c050d3fd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDY1ODAtY2IxMTQ0YmQtYzY5Ny00MGZiLTk1MWQtZjZkN2MwNTBkM2ZkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVlOGZhMDEyMzg4ZDA5ZGNlZTNkMjA2NTRjOGNmMmQ1NjUyNzZiZGVlNzRmYmMxMjE3OTYxOGIwYTgzOTE1ZmYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.55J2_DPgx0Nsx6vFfpeM4xEnAluNaV1Qv1f4Xz8k-bI)
https://localhost:7074/Account/PerformExternalLogin
redirects us to GitHub's authorization endpoint:
![image](https://private-user-images.githubusercontent.com/30603497/277507128-50538aa5-0641-434a-ae10-2e206cb08481.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDcxMjgtNTA1MzhhYTUtMDY0MS00MzRhLWFlMTAtMmUyMDZjYjA4NDgxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU2NGY5NGFkMGY5NTkwOTUwNTQyN2I0MmFmNDYzYTJkYjY1NWQwYmNkYzQ2NDE1Mjg0OGVlNzhkNDY1ODdkZGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.m_3zEeHRltHFy1mUNrk7UKh-UMlM4GQ5u4kGMimtcg4)
So the app goes to that location:
![image](https://private-user-images.githubusercontent.com/30603497/277507460-6c1de721-730c-4a9b-9212-f1c0d37c5f34.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDc0NjAtNmMxZGU3MjEtNzMwYy00YTliLTkyMTItZjFjMGQzN2M1ZjM0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ5NmMwNThlNzcyODFlZjNmZDdjYjlmNTkxZTE3OTM1Y2VkMzM5YjdkMDVlOGM5YzAzZjgyMzJlNjU4ZjgwOGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.kG5fLX9AYfsjZ-U_lqVcz5jMKIX7OufZRBQ6w8Brcws)
At this ppint the user authenicates with GitHub (NOT this app) and the user authorizes this app to fetch user info from GitHub by accepting the consent screen.
User gets redirected with the one time code to the callback url:
![image](https://private-user-images.githubusercontent.com/30603497/277507601-b00ae5cb-8049-4f04-a66a-7028dc05c30e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDc2MDEtYjAwYWU1Y2ItODA0OS00ZjA0LWE2NmEtNzAyOGRjMDVjMzBlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM2NTBjMTQ4NTM5ODgzMjA5OGI1OGFiMWFlNDRkNzMyZDNkNjk3MDdjMGM1ZjQ5MDlhODBiNzMzYTA2N2Y0MTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.0FTTR4qoD-ggyiF7JsPYuLGqdLjajFPaetXaWHQOUuI)
![image](https://private-user-images.githubusercontent.com/30603497/278841054-bd2a2f49-ec27-484c-ac78-4c8d2fc1f1fb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDEwNTQtYmQyYTJmNDktZWMyNy00ODRjLWFjNzgtNGM4ZDJmYzFmMWZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVlYmU1NTJiYTFmMWVkZjdhMmEzMDE4ZDAzNmI5OGE3N2FjYTdhZGIzMWY0ODhlNWNhM2Y5YWRmOGU5Y2ExNGQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.BmT19FSUYtc6W08kxyRhWBpJNNAW7Bo94XKZeNnIyx4)
OAuthHandler
says "I will" because ShouldHandleRequestAsync()
returns true
as seen in RemoteAuthenticationHandler.cs
:
![image](https://private-user-images.githubusercontent.com/30603497/278840760-418de550-8f9a-489b-b466-5c6e6d065c72.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDA3NjAtNDE4ZGU1NTAtOGY5YS00ODliLWI0NjYtNWM2ZTZkMDY1YzcyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYxOTU0NjZhZTBkMzE3OTA2OTlhMzk1NmE0NDIxMDkwNTJiYWNiNDlkZjdiNjJiZTljNTM3ZmYyMzQyZDE4NjcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.L2mFdJV1faN9WK2PrrB0iA0p3DQ8KLEZlzN-RzclqPc)
When line 87 shown above runs, we end up in OAuthHandler.cs
:
![image](https://private-user-images.githubusercontent.com/30603497/277508722-f8c82466-55ac-4b97-a8ba-533df1165d57.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDg3MjItZjhjODI0NjYtNTVhYy00Yjk3LWE4YmEtNTMzZGYxMTY1ZDU3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVmNTA1OTczNDZjNTUzMDg4ZmY3NTE0YzRhNjM1ZmRhZWQ3OTNlNzY2Y2IwMWU0MTJkMTY3NzYwNGQ4YmM3ZmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hnSWU3eQfLBvdj99mytVxFZcB51VTtNZx5e-4BJdm1Y)
The query has code and state.
![image](https://private-user-images.githubusercontent.com/30603497/277508599-e5d61a96-0f32-492a-a095-68ce34382dac.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDg1OTktZTVkNjFhOTYtMGYzMi00OTJhLWEwOTUtNjhjZTM0MzgyZGFjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNmNDc1ZjQxMDA0NzRjNGY4YzAyOTJjMTRiNDg1YTEyYzI0OTVmNGYwNWY1ODYxMmY0N2I2OWNhYzhlYzg2OTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.adSauHFPmPmd4sdDfBx7hFutQOoTbe9P2LJXNpEnLxc)
The state has redirect url and login provider we set earlier:
![image](https://private-user-images.githubusercontent.com/30603497/277509318-4852f83e-af86-4983-97be-f79352ef52c0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDkzMTgtNDg1MmY4M2UtYWY4Ni00OTgzLTk3YmUtZjc5MzUyZWY1MmMwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU1ZWI4NDMwNzI1OGFhYWIzOTg2N2RmYmEwNGRlNDI2MjFhZTEyNmMzZTBmMzZlOGRmZTllZDk0ZGQzOTkyNDYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.MGso5w7gJnx_6B7QgV4hncrvZmSPjn77fKLhJysb-1I)
The code is exchanged for the token here:
![image](https://private-user-images.githubusercontent.com/30603497/277510023-51dc3939-bbd1-42e9-9c4f-14b5c0cff9ac.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTAwMjMtNTFkYzM5MzktYmJkMS00MmU5LTljNGYtMTRiNWMwY2ZmOWFjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNmYWE5ZDI5NzgzMjk5NDg5YjVjNWZhNjkxY2UwYzdiZDNmN2U5NDcxNTg2ZjFkMTRiZjUxMzBiYWM2NmNlNzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.c6gt-93kqPnxt2eSFQ9Q6Pq01uyqdaQlfcz1rXnKmpw)
Dummy identity is created:
![image](https://private-user-images.githubusercontent.com/30603497/277510467-3aa27088-72af-4dfd-9549-8c84b5115e72.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTA0NjctM2FhMjcwODgtNzJhZi00ZGZkLTk1NDktOGM4NGI1MTE1ZTcyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY0OWY2M2JiYWQ4YTM2OTE1YzA2YTkyZmNkMmRhOTRhNDRkN2Q0MzNmODFjNzQyMWMzOGY1NDk5OWFhZTBiMGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.jO0Bv7RyUKWBIA96jQe7qFQNl4U7aca_PBTzuO70jH4)
Towards the end of this method, a ticket is created:
![image](https://private-user-images.githubusercontent.com/30603497/277511368-9482726e-92c9-497f-ae8f-f3821a08e2c6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTEzNjgtOTQ4MjcyNmUtOTJjOS00OTdmLWFlOGYtZjM4MjFhMDhlMmM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM4MDUwYmNhZDhmZTBiMGZiNzk0M2Q1YzE3MTUwODQ2NDg5YWRhNDY3YTQ3YjcwNGM3MjYxYTgyYjM1YjllZGImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ESZHguy5EQjGlMlz-EZlYkeWkxvyvGg-QMylETgRUnc)
By calling this callback:
![image](https://private-user-images.githubusercontent.com/30603497/277511734-d5a31a96-1eee-42b3-a171-cff98e00b9eb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTE3MzQtZDVhMzFhOTYtMWVlZS00MmIzLWExNzEtY2ZmOThlMDBiOWViLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMxYWRkMTcyMGMzZWQ0N2U1ZTlmMGNmNjFhZDI1OGQyM2Y1NDY3OGM2N2JkZmVmYTUyYmYxNjdjMjQ4ZGUwNzImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.tNgyKV294172afKLAgnN3QzTSIaRmrT3gWLT_xNaI58)
Now we're back in RemoteAuthenticationHandler.cs
.
Inside HandleRequestAsync()
, we set which scheme produced this identity:
![image](https://private-user-images.githubusercontent.com/30603497/277512191-ded03b88-3c8a-4ab2-bd51-268087cdfa26.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTIxOTEtZGVkMDNiODgtM2M4YS00YWIyLWJkNTEtMjY4MDg3Y2RmYTI2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg1NjcxYzA1YWQ5YTYxNmVhY2IwYjcwNWVjZDdmYWVlM2NlM2RiM2ZkOTE1YTE3YjIwMjRiNzczYmYxMjVkMDQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Ee-norvsP08Vy9BM41zomOLTUc80p9XhJPtexLCfeHE)
In RemoteAuthenticationHandler.cs
![image](https://private-user-images.githubusercontent.com/30603497/277512385-a7b6a17e-93c6-437e-8172-3cc725d8d117.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTIzODUtYTdiNmExN2UtOTNjNi00MzdlLTgxNzItM2NjNzI1ZDhkMTE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk1YzUxM2EzYjdmMGY0MjNhN2UzN2E2ZGZhN2YyOTNkNGVjMWFiN2I4NGFmOGViYjA2ZjE0ZDJlYTJjOTcwZDkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.GNbuvBZQOYATTfx-lqDOIaaIJgbbwLdOor94MpM4teg)
The Principal
looks like this:
![image](https://private-user-images.githubusercontent.com/30603497/277512592-efdedcb0-6096-4fa7-a64b-1f2d06639284.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTI1OTItZWZkZWRjYjAtNjA5Ni00ZmE3LWE2NGItMWYyZDA2NjM5Mjg0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI5ZTkyYTBlNjQ5YWE5NDcxZWViM2Y2ZGY5YzNkZmVhM2JkNzFkZmFlYjA3OGY5MTRlZDZkNWFjZTgxNTM4Y2YmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.rPfS15700uMe4EU_ocZzObKhaEPl35jPhkcD0v-TiFY)
And the properties:
![image](https://private-user-images.githubusercontent.com/30603497/277512669-a7bd09e9-05fb-45d0-98e4-103c85f26f2e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTI2NjktYTdiZDA5ZTktMDVmYi00NWQwLTk4ZTQtMTAzYzg1ZjI2ZjJlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM2OWNmNTk0YWJkMTU1MTQ0OWFjMTQxNDE2N2ZlZWQzNGFhMjdkYzMyZjI4NjdlM2M2MTY2OTk3ZTYzY2ViM2EmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.OMYbfh26oAt3sPPxZkUIMzB7Wp25gKD9FIm10Z0_tw4)
Now we're in CookieAuthenticationHandler.cs
's HandleSignInAsync
method:
![image](https://private-user-images.githubusercontent.com/30603497/277513438-53828fd4-b44a-41f8-93fd-8adba174305b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTM0MzgtNTM4MjhmZDQtYjQ0YS00MWY4LTkzZmQtOGFkYmExNzQzMDViLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVlMjQ2NmQyNmFjNmUxNDkxOTRkM2E4NjA0MDQ5YjgxMTY4ZDNjZTQ2M2U4YzQ2ODJmYzY0YjYzNWYyNGM5ZTImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ByYjBzKQaYFxWTuw5ri8wFD1O0G8WI5Qr0sBMZd1NyM)
A new ticket is created:
![image](https://private-user-images.githubusercontent.com/30603497/277513620-62d52eda-c8be-4219-984a-b71f6faab16c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTM2MjAtNjJkNTJlZGEtYzhiZS00MjE5LTk4NGEtYjcxZjZmYWFiMTZjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIyMmJiN2JhMDgwYTBhNmYxMjE0YTc4OWVkZjQxYjhmMDAyZGI2NmZkNmI2NzMwYjdjZTg1NDNhMzk1Y2E1NmUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.LC-_px8xYoN6IlvnZbN3t2gk5XDQlTE5WFYl_B13Gi8)
![image](https://private-user-images.githubusercontent.com/30603497/277513684-abf50c5c-5ea2-4739-8e05-b798d41d05c6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTM2ODQtYWJmNTBjNWMtNWVhMi00NzM5LThlMDUtYjc5OGQ0MWQwNWM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZlZDY5MjJjMjQ5MTk4ODg4YjkxMDQwYjg2MGI0ZTY3Y2IxYjdmN2VmODNiZTg5YTgxYjdjODViOTg4MjE4NGImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ySCvACwEjnpigrh4NYOjDdSfnHMK11UQ6wPHfWS-gPo)
![image](https://private-user-images.githubusercontent.com/30603497/277513727-5ecc20bb-a5e3-464e-a676-578c37762deb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTM3MjctNWVjYzIwYmItYTVlMy00NjRlLWE2NzYtNTc4YzM3NzYyZGViLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVhMjU2YmQzOGIwYzkzYzk0NDVjNjJhZTZlZGU5OTIzMmVmMzI1ZmJlYWUwODNmNzg3MjIyZDMwMjE1MjY2MzUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Gck8ZGrYELtXC0u0GCwdnp6QmUGej2YGp6CWQGqRJkU)
The method completes:
![image](https://private-user-images.githubusercontent.com/30603497/277514241-799879be-724c-4365-b775-b967b1015f42.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTQyNDEtNzk5ODc5YmUtNzI0Yy00MzY1LWI3NzUtYjk2N2IxMDE1ZjQyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc2MThhY2NkNTc0YmExMjkxZTlhMTdhNjkxZjc1OGZkNjhmNDA3Mjc5ZDA0Y2E2MjE0YjkyOWJhZTBhM2JlN2ImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.2YSVF2hoJ4BVwvMjHNUXtADyj1DhSD0bwodS7G5Ymz0)
This method also completes:
![image](https://private-user-images.githubusercontent.com/30603497/277514402-691d6e9b-8a80-42b8-9235-b92dffeba3a3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTQ0MDItNjkxZDZlOWItOGE4MC00MmI4LTkyMzUtYjkyZGZmZWJhM2EzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ4ZDcxYWY0NzEwNGZkYzAyNTZhNjY1Mjg1ZGViOTE1YmM3YjEwOWEyY2ZkNThjOWFhN2M2OTI0ZTljZGRlYzUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.rhR87M_NGvxT0Hd0cg4lkwgdKbFoa7eWy1xrLkceB4o)
Now we're back in RemoteAuthenticationHandler.cs
's HandleRequestAsync()
method and about to get redirected to our original ReturnUri:
![image](https://private-user-images.githubusercontent.com/30603497/277514646-ce59159e-c32d-405f-990b-03612c9c5044.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTQ2NDYtY2U1OTE1OWUtYzMyZC00MDVmLTk5MGItMDM2MTJjOWM1MDQ0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTViMTUyMDIwZmNiYTNhMDQ1OTU3OWNlYWUyZjllNGM1ZjlmODhlMTNjMWE0ZmI5NWU3M2Y0YWM5ZThhOGI4NmEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3PYLrWWLuuBaZIii5CikQiOL4M9k7HtBgjqrAeYrCIY)
Now we're redirected with the "External" cookie
![image](https://private-user-images.githubusercontent.com/30603497/277515232-3db98c10-d5d5-4837-b810-a9a389ae8c3a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTUyMzItM2RiOThjMTAtZDVkNS00ODM3LWI4MTAtYTlhMzg5YWU4YzNhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM5ODFkZjM4ZGVjNmIyNjRiOGZiNDZkYjRmMDQzMzdkNzVmNmZmYjcwZjFhMTRhYTQ3M2I2YmY5NTQ5NTVhNzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.KK2xCHPVQEL0Ixdja5ApGAVGT1GhjolMLcC9qDXK_Vo)
Now we're in /Account/ExternalLogin
(In ExternalLogin.razor)
![image](https://private-user-images.githubusercontent.com/30603497/278841169-b19591c8-47c0-4bae-aa83-31dad84c7e47.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDExNjktYjE5NTkxYzgtNDdjMC00YmFlLWFhODMtMzFkYWQ4NGM3ZTQ3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWJkN2U2NGM0MDdlNjIxNWUzNjkzZjc4ZWY0OTU0MDgxODJjMmRkMjk4NDUxMGFlNzJkYWYxMGE1YTFkNDZhYWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.48URLIY5mDQyhHH351Zha31ARFeQPhD9y61ht0pbfTM)
We try to authenticate using "External" cookie to get external user info:
![image](https://private-user-images.githubusercontent.com/30603497/277515775-9ff77a0c-e3e5-4ec8-8c4a-0f5e6e92295a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTU3NzUtOWZmNzdhMGMtZTNlNS00ZWM4LThjNGEtMGY1ZTZlOTIyOTVhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJkNjA0M2VhMjhhYTkyYTIyMTNmNWJhNGU5OTJmZWMxNzhiMTFmNzYyY2M5ZmJiZDkwZjcwMDliMzE2NTk4MDcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.NBZ6aUsBgg8rkcYBWrVLj_GIggfqRHbFuuLTmgdsmbM)
Now we have userinfo:
![image](https://private-user-images.githubusercontent.com/30603497/277519290-e535c97e-68c2-40e7-b87c-c1cee4169963.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTkyOTAtZTUzNWM5N2UtNjhjMi00MGU3LWI4N2MtYzFjZWU0MTY5OTYzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI2NTBlODUyODRlNjA3NGQ0NTY4M2VkOGY1ZWI1YjgwMDUzOGU2OTNmYTYwNzhlNzE2YWJkNGVlN2VlYTBmODYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.npnscQh3vNdjBI_wCyppwKsd_Ng-N28iUoVbV4hZ88g)
![image](https://private-user-images.githubusercontent.com/30603497/277519405-44fce317-969a-4447-ad47-8efd62f17e99.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTk0MDUtNDRmY2UzMTctOTY5YS00NDQ3LWFkNDctOGVmZDYyZjE3ZTk5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNjOTMxMjQxNjFmMWQzMTU2YTM0ZjE0ZjU5ZDhmNmY5ODQxNWE2YmU0Zjk4MzUyYjQxY2E3ODYzMDZkNGQ1NWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.vhENfKAy9TDDxrbYfBgMxtsLGYNr1ISdqD1CD7GV-yM)
ProviderKey
is the Id in Github.
Now we go into OnLoginCallbackAsync()
:
![image](https://private-user-images.githubusercontent.com/30603497/278841992-3d043121-946d-44f6-aaa5-f70a9316faa6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE5OTItM2QwNDMxMjEtOTQ2ZC00NGY2LWFhYTUtZjcwYTkzMTZmYWE2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMxOTM2MTkwYjYwYzBmZjdhYTgxODIzZTZjMDQ4MDcxMDlkNGVkMWUwMjk4MDJjZjY4MWRjNzk4MzBjMDZjYTImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.mXp6pdnaRzXnJkLZE4KHHh8ZbF5RgsdsJNbiMSUWZYg)
Here:
![image](https://private-user-images.githubusercontent.com/30603497/278842120-f403c022-4976-46ec-a90b-0187b309a244.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDIxMjAtZjQwM2MwMjItNDk3Ni00NmVjLWE5MGItMDE4N2IzMDlhMjQ0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlhZmIzMTczODk0NGFmYzExMDYxN2U1YWM5MTBjNzdhMTNmZjdiZTk1YzhmMGVmMDc1NWM1MDc0OGE2Nzg3NjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.a5g-IFXAq3dwM1K0wiJxB1qqtpFzr3albAfdP8yXXGs)
Now we get into SignInManager.cs
:
Looks like there's this neat method to get user by loginProvider
(for eg: github) and providerKey
(for eg: 30603497).
![image](https://private-user-images.githubusercontent.com/30603497/278842193-9503fe80-ab4a-4efa-843b-d0fc0cc0120f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDIxOTMtOTUwM2ZlODAtYWI0YS00ZWZhLTg0M2ItZDBmYzBjYzAxMjBmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFhYWM1ZTUwMWI5OWVjZGUyYzAzZGVmNWZhY2FiOTQ3NzBjMWViZmM3YTRkNDcyZmJjYjU3MDYxOWNhMWE1ZjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Xp_RiqQ6ujC5fI-S-eG_1pNfaRr7_lKB_4LipYSi6xk)
Whenever AuthenticateAsync()
method in AuthenticationService.cs
runs AND AuthenticateResult.Succeeded
is true, ClaimsTransformation is run.
![image](https://private-user-images.githubusercontent.com/30603497/277518475-4fe09ea7-7cfd-4a7a-ac8b-f4401b0ff828.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTg0NzUtNGZlMDllYTctN2NmZC00YTdhLWFjOGItZjQ0MDFiMGZmODI4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI2NGNmMWNkOWM1NGE4NmRlMDZjNWY0ZDRmOGZjYWZiNWViYmNlYjU4NGExNmM5NzVkMjJlZTdlMjAxMTc0MWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.X13ur-6Qem6qmM5MV-q_9h-J_UuOqnRGsXzVVEboJRk)
Here:
![image](https://private-user-images.githubusercontent.com/30603497/278840028-fcd8d092-a4a9-4721-8cbd-47e2fbe10dc0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDAwMjgtZmNkOGQwOTItYTRhOS00NzIxLThjYmQtNDdlMmZiZTEwZGMwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM5MzQzN2VhMTg3MmJjZTcxNmI5YTM3ODg4ZmFjMzNiZWU2NGIzYzA4OGY5ODFhYWZjN2Y4NzRmOWU2MWMwNjcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.xVLQtgGPqRqbP5dWLyMnCfD3ngsJWB7Hfb49QfvtgQs)
The action in the query is this:
![image](https://private-user-images.githubusercontent.com/30603497/278841261-008bb985-d0a1-409a-b738-3fe277cc2fde.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDEyNjEtMDA4YmI5ODUtZDBhMS00MDlhLWI3MzgtM2ZlMjc3Y2MyZmRlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU5OTA4NDE0ODE4ODEyNjNhMTJhNjhkMDI1MzEwMDBhY2NhODljMmZiNzYxYTA1NjQ3OWNkMzQ3Njg0Mjk1MmUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.y9OehJREA5M6QqNSrbh8oPrRwDA8FRsDrn84nKJplA8)
Also notice the user is not authenticated at this point because we haven't successfully authenticated with the default authentication scheme (Identity.Application).
If for some reason, we're not able to get externalLoginInfo
, an error message is passed through the cookie in the redirect to be shown in the UI.
![image](https://private-user-images.githubusercontent.com/30603497/278841548-45b207d1-ad0d-447c-a5aa-e3dd69495ec8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE1NDgtNDViMjA3ZDEtYWQwZC00NDdjLWE1YWEtZTNkZDY5NDk1ZWM4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQxN2JkOTVhMGQ0NGQ2OWE5ZTQ4ODUzOTk5OTEyNTlmZmViNjhiODM3NzBiZWMzN2JjNjQ4MDYyNGQ0NmI1NzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.9MkqJoy0ixFbG8Dd1TSa2aR10NDBZd2k4W8bjVizR0Q)
Like here:
![image](https://private-user-images.githubusercontent.com/30603497/278841574-bec7b97d-53de-4a31-b4d8-bbfc44e812e4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE1NzQtYmVjN2I5N2QtNTNkZS00YTMxLWI0ZDgtYmJmYzQ0ZTgxMmU0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUzNmJmOWU1NDBiY2E4YTJlZWU4YWY3MWVjYjMyYzc3ZjE1NGUyZTA5MjgyZDlhMGJiOGEzMGFkN2YyM2M5MjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ADLXCF5XjXdmOqJFZf5hTccugC5e9qkF0c_rr3KgbKc)
The message comes from this component in the Login.razor
page:
![image](https://private-user-images.githubusercontent.com/30603497/278841586-ac86c4ae-2f00-4ede-8c8c-3fe59a01c38f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE1ODYtYWM4NmM0YWUtMmYwMC00ZWRlLThjOGMtM2ZlNTlhMDFjMzhmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE5YWJmYzE5ZGRiNmYyM2IxZGQyNWVhMzczOThiMWY1YTVhZmU2YjZjYWUxYjY2NzRiY2ZhZjA4N2Q0MmQ1NWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CgdEIKSTFvES3_H0cGpy4_JYh70F0DseHsDejLKbBUw)
![image](https://private-user-images.githubusercontent.com/30603497/278841607-82cda3b4-1fc5-47b2-a308-acce45d1a7d1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE2MDctODJjZGEzYjQtMWZjNS00N2IyLWEzMDgtYWNjZTQ1ZDFhN2QxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY5NDc3NzllZDkyNjc4ZGEyMTQ5ZTFjOGFhN2VhN2I5NTc1MjM0ODc1YTI2NTIxNWVmZjJlMzc2YzExNzAxZDMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.iZYiUbhE6zQ369wg_eS6xf9wLhtTqQvsKoZaYdI7d8Y)
We're still inside SignInManager.cs
.
Here we Signout external cookie:
![image](https://private-user-images.githubusercontent.com/30603497/278842292-00031e8f-78b7-42ec-8fdf-4e98d21d4563.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDIyOTItMDAwMzFlOGYtNzhiNy00MmVjLThmZGYtNGU5OGQyMWQ0NTYzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNkNTAzYjExN2FiYmJhOTUyNTZlMzVmZDM5NjgzNjFkYWJmMjE2M2FjNWEzMjhiYzliNGQ5Mjc4Zjk1ZDQzNDMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.S2nqunQ3D4HpTYecssf_GUeYvrfCxAUzM4t6wsklLCA)
And Signin primary cookie:
![image](https://private-user-images.githubusercontent.com/30603497/278842325-4365d496-9cdd-44ea-a2a4-f32d41524a13.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDIzMjUtNDM2NWQ0OTYtOWNkZC00NGVhLWEyYTQtZjMyZDQxNTI0YTEzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE2NGZhMWRjNWQyMTU5MTQ2NDBjNjVhZWUwZTE4MzI2YzRkMjM0NWE4NGNmNzUwZjEwMzNiOGU3NDU0NjQ2ZDEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3cuxN4OL-a85DzivT_Jn0fBZAh2KjwOBmyZhHmOyq10)
By calling this method:
![image](https://private-user-images.githubusercontent.com/30603497/278842477-21eba0ce-135c-4d40-963b-9606f31b81b5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI0NzctMjFlYmEwY2UtMTM1Yy00ZDQwLTk2M2ItOTYwNmYzMWI4MWI1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU3YjNiODFlMTQyYjYyZTgzZDQ1NDE1ZjRkYzgxOGQzMGZlMDNhNzg1MDY3YmRjYWFlNDc5OWNlZmFiYzQ1YWEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.eG40Hk8QVYSXE_5hiNQwlK7FdfqYPlh0_CKNQhqIzRs)
Looks like it adds provider name (github) as an additional claim.
![image](https://private-user-images.githubusercontent.com/30603497/278842532-dbcc552c-2957-4f5f-a6e5-6873c6b6e412.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI1MzItZGJjYzU1MmMtMjk1Ny00ZjVmLWE2ZTUtNjg3M2M2YjZlNDEyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYyZWI0NTgxZjAyYmRjOTlkMjEzOTE3ODc1Y2Y2YmIxYmIzYzg4OTA4N2RjMWU5ZWQ3YWRiYWU2NjdmZGNjNmQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.t4M7tGuumGz59gp6VTfbSeX4HKx55_MlEn7Vny4vH5M)
Then call this method to sign in on primary cookie:
![image](https://private-user-images.githubusercontent.com/30603497/278842613-8dcee766-d097-49f0-aac3-e95039dc14ff.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI2MTMtOGRjZWU3NjYtZDA5Ny00OWYwLWFhYzMtZTk1MDM5ZGMxNGZmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE1ZWRkYzg5NWQ4Njc2MzFjY2E2YWI2ZmI4ZTk3MTBkM2YzMzc2ZjczMjM2MDE2Mzc4NTJkMjZjYTYwNzdhZTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.qkLPnJe0mmh_lEql1Zp9GyNv852isI51-EqxSo7KvfY)
Now we're back in ExternalLogin.razor
by logging in the user successfully.
![image](https://private-user-images.githubusercontent.com/30603497/278842647-b73ea334-14d8-4b31-8558-41a7408216e9.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI2NDctYjczZWEzMzQtMTRkOC00YjMxLTg1NTgtNDFhNzQwODIxNmU5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY5NjIwY2YxMzA3Y2I1OGU0YTBlY2EwYzM0ZDFiZDBiYjg2YzIwM2ZkNWUxODU2NjU5NGFkM2Q2MWQzYzMzZTkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.PcQTqTngCKUWUIxFqojdDC_5DG8pOt5S3j-NEtwACkI)
We get to homepage now.
![image](https://private-user-images.githubusercontent.com/30603497/278842837-9bdb9062-226e-4bc0-9d19-a92595277f75.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI4MzctOWJkYjkwNjItMjI2ZS00YmMwLTlkMTktYTkyNTk1Mjc3Zjc1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZlZjE1ZTFhOGJmMWI2ODk5YmIxOGNhMzY1YzRhMjQxZjQ5OTc2YTY5NGVhMTIwNWQ2ZmMzOGZlYmMzNjk1M2EmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.33u9-UlhhKJVNLmPHQ48Wny1zLEcf27_xs2eUKIx244)
Like this:
![image](https://private-user-images.githubusercontent.com/30603497/278842868-cc1483b7-ac6f-4bf0-bcab-8443825008fa.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI4NjgtY2MxNDgzYjctYWM2Zi00YmYwLWJjYWItODQ0MzgyNTAwOGZhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE1NjkxM2JlNjQ3MTdmNDIzZmM0YzM1NmE5NzVkYWM4MGM5YTc3OWY0ZmY2MTIxMzRjOTMzMzJjMGVlZWNkNGImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.vjN_E0iaD0wxrP4cemo7vCBtoSv1fG_V2v4tPYPdE-8)
Now we hit AuthenticationMiddleware
and try to authenticate the user. The Identity.External
cookie is removed and Identity.Application
cookie is present at this point.
![image](https://private-user-images.githubusercontent.com/30603497/278842883-01dd551f-657a-4b98-b62c-47e9c4d4dd91.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI4ODMtMDFkZDU1MWYtNjU3YS00Yjk4LWI2MmMtNDdlOWM0ZDRkZDkxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTkzNTNmM2E5ZDAwMWVlZmIyY2UyZWVlZjNmNTgzNGM1ZTk5NTg5Njk1YWJkZGRhYjViNzI2YTU4NmM2NTZlZjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.oaolcD2ah4q1QZgRiKUP9-Heqe1xsa7-fjQGjFl-5lY)
![image](https://private-user-images.githubusercontent.com/30603497/278842754-8c12158c-99c0-4f0d-a4ae-871f17846713.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI3NTQtOGMxMjE1OGMtOTljMC00ZjBkLWE0YWUtODcxZjE3ODQ2NzEzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZmZGFkZDFhZWQwNTBmMjRjNWM5MDU1NzNhNDc4MmY2NDBiNzVmYjBkY2JkZjUxNTJjYTdiNzcxM2RiYTdkYTgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ymS9hR6l6BeFrswB1FAADfDr61mx0hteWa7KMk2Nccc)
Success!
![image](https://private-user-images.githubusercontent.com/30603497/278842764-661fd65a-2a37-4e3c-9947-9d5b2b07aea7.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxMjY3MjgsIm5iZiI6MTczOTEyNjQyOCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI3NjQtNjYxZmQ2NWEtMmEzNy00ZTNjLTk5NDctOWQ1YjJiMDdhZWE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA5VDE4NDAyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFhMDYyYTdmYzJiNjhjNWJkNmM2ZmZkYzllYWRlYWQ4OTU0MTg0YzJjYTc0YWU5MzhmMTU0YTFlOWNiNDllMDImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ZFmkFtWmxDA1_SvABdHDmenYaNzd8Srv27DFg1SispI)