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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzQzODcyMDgtODQ5ODJkNjUtN2JmYS00ZDMzLWI3NDktM2ZjYjAzYjM2ODhmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZmOGYzYjY1YTg2MjBmZmMyOWU3YjRjODAyMWJmNjc4OThjNTFlMDcyNWQ2YzZiYWQ2ODY1NDc0YTdhYzFjNDgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.HpQCmjRvG1_yEOIiuqyZELvArxYE2Y9Q_ENKMZy9hP0)
- 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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzQzOTA3MDgtZjhhOTlhYTQtNjc2OC00NDdiLWJjNGMtZTk3NTJkMWU4OTZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQwYThhY2JjMmYzMGVlNWUyM2U2NDBlMjYzOTAwMzA1YTQzYTRlZGM4YTViMGMyMjMyYTg0MjA5ZDZhNDgwNzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.EJOz96Pwd_QfUGdWGSx2uV3L6qyiXqZ6vxKx5eIbZbs)
Program.cs
![image](https://private-user-images.githubusercontent.com/30603497/274390779-81f7e84a-4360-45a1-90d7-360b28c003b6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzQzOTA3NzktODFmN2U4NGEtNDM2MC00NWExLTkwZDctMzYwYjI4YzAwM2I2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTAzZWU1ODE4MjZlYTQxOWEyMThlOGM1ZDQzMWE3ZWU3ZGRkNzUyOWUzNDQ2NjBkNDBmZGIzYzM4MDEyY2YzYWYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.EenPk-JhO3e1HH73_2stY-MuE4WUUM4sVLNpVZwBkYQ)
WeatherForecastService.cs:
![image](https://private-user-images.githubusercontent.com/30603497/274390998-b518a68a-a07f-417b-a9fb-dac19ea7e94f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzQzOTA5OTgtYjUxOGE2OGEtYTA3Zi00MTdiLWE5ZmItZGFjMTllYTdlOTRmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVlMDc4ZTQyNjg2M2U4YThiZjdkOTRjMDQzMTgyYzgyYTZjNTkyYjQ2N2Y0Yzc1MzMzNThkODczNzZjOWZjMzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.y1qlog7JB00_erD2jYnQ9WYYxF9HQHTG-gzuivhOfqo)
Add Microsoft Authentication to your app. Reference.
![image](https://private-user-images.githubusercontent.com/30603497/275102431-ecb5b07c-63d1-4dd0-9eff-2bf0faa4eb42.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMDI0MzEtZWNiNWIwN2MtNjNkMS00ZGQwLTllZmYtMmJmMGZhYTRlYjQyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWFlYzM3MzJjZTcxY2U0OWM4Y2VkOGYzMWYzNzUwOTMyYmU5MmUyNmY1YWE0MjFhMzdlMGVmZDQwMWE5ZjQ3NTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.60rhM08EGwQejU7iUJ01LUGSJ-7LTSNhzMbQfUdsWq4)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMDQ1NjItN2ZlOGI2ZWQtMWUzZS00ZWU2LTk2YTEtYjNhMWEzNDNiMWIyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk3MWE1MmY4MTU2M2E5YjE0YmZkNmNiODVmNGUxYWZhODkzZWQ4NjEwZjc5Y2RmNzFjZWFhZWJmOTY4NzljODQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.76nIvB6smpuF7grLAW4PsQ25dtZg92pmQpcyQaIRqp0)
![image](https://private-user-images.githubusercontent.com/30603497/275106139-076100a7-876b-43aa-9757-09deac4c11ed.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMDYxMzktMDc2MTAwYTctODc2Yi00M2FhLTk3NTctMDlkZWFjNGMxMWVkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ0ZmQ0ZDJmN2ZlMDBhZGZmMjU2ODcxYTAwNGE0OGQ0MmRiM2E5NDhlNTZkNWNhMzk5MTYwYjk3NTBjNzYzY2YmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.m4dIcn2E2WNLYvg8PZD8_bOD28eMRjXPz0V2omrSxnA)
![image](https://private-user-images.githubusercontent.com/30603497/275107886-930f4184-26f4-4fdb-a6e1-ca7e84790eb8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMDc4ODYtOTMwZjQxODQtMjZmNC00ZmRiLWE2ZTEtY2E3ZTg0NzkwZWI4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdlNjAxZTkxMjNkM2U4ZjdkMTQ5YjJmNDk0MzdmYzM2NTU5Mzg0MDZlNzAxZjYwOGZiZDM3OWM2ZjE1M2ZmYTYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.EbBSAIpZiYBeCgsGUTJHOl3pgmQWDOGXxuuoKpSwhVU)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODMyMTQtZjkzZTE5YTAtZTViNy00MzgwLTg0OTctOWE3NWI3ZTdjMDg4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY3YWZiNGE5ZTJkNTY2YmQwYmFkYTYwMTI3NWUzNDk1ZmU5NWY0ZGFiNTc4MDYyNjdiYmQzZWFiNTlkYjYzNjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hJBH_2h9q5tgQav6jb589USq1_Rza7t_ibUR2oYdMHw)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyNzk0NzMtODJhYTkzYWMtZjgxZi00YzM2LTk4OGUtOWM5MjI4YzI1MTJjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM0MjBhZmYwNjdhNGY0MDZjYTc5NDdhMjE1ZTZlYTk4ZmUyZWU2NjkwYzZhMTc2Y2Y1MjU1YzU0Y2ZlZjMxZGQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.t0kguJ325artQkbVX4UX8uMyfxJOtDaKi2w3sPjkZms)
Command + Click on .AddMicrosoftAccount
method:
![image](https://private-user-images.githubusercontent.com/30603497/275282669-ef6ff0ff-9b6b-43e0-a39d-28ea90500e8f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODI2NjktZWY2ZmYwZmYtOWI2Yi00M2UwLWEzOWQtMjhlYTkwNTAwZThmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdiZGY5M2I3NmM3MjE3ZmMwN2IxYzcwMGQ5MWE2OTIzZWJiOTI2MTA2MWYwOTE2OWMxZjEzODg5YWU1NjM0YzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.PgLFYi7xFuKtrPH7x7vc0NwVvvu5DM76brHDZgwZ8EU)
Check what AuthenticationScheme
was used:
![image](https://private-user-images.githubusercontent.com/30603497/275282710-674d6247-cb1c-4e43-9816-e4d125b7a792.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODI3MTAtNjc0ZDYyNDctY2IxYy00ZTQzLTk4MTYtZTRkMTI1YjdhNzkyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM1MGJjOGU1MzNhMWFiZTQ3MDIxY2IzNjU4NTUyZWY3MjYyZDI1NzY2ODJjYjMwNzcwZGZjOTczMWM3YjVkYzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.o-L8_DXyE5eTFxfZp9f3dMopCvUbWW1GwtPfxQBStEs)
By going to MicrosoftAccountDefaults
:
![image](https://private-user-images.githubusercontent.com/30603497/275282759-fdbe90fb-286c-46c1-8d2b-0e07f4015a49.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODI3NTktZmRiZTkwZmItMjg2Yy00NmMxLThkMmItMGUwN2Y0MDE1YTQ5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFhZjM0ZTE4MmI0YTcyYzg1NTRkZGFhOTc2NmQ1OTcwYmYxM2RiNzRhNGMyYTZlY2M2NDQwODI0OTE5ZWUyNmQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.gvtaWRjQMZ-sxZEh7Mbgga9EbjiO6SmGNv1DIZ-L8M0)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUxMTA5MTgtYjBhMmZjNTItYjhhNS00ZTYzLThiMjAtYTE4OTQ0ODQ4YjY0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE0ZmFjMTZhNjQ4ZTFkZjg2Y2IxMDE4ZWViODNlNzM4OWUyMTgxMGE4Y2Q5MWQyMGM1MTM0Y2QyZThjMjJhOTkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.sdUTIRWpfln3gzH50m03qsP7FaO3wkk3vJONKvQe4x4)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDM3OTYtNGRiYWY0YjYtYjQzYi00NDEyLTliZTMtYmQwOWU2ZGQzMDg5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZlYjFmM2U0OTYzYjQxNTRiYzA1ZGIyZWRiMTRlODM5YzI2ZDJmODM4NGI2NzU0MzI4M2NhNzQwYmIwMDVjYjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.F_dzpoFPs63NJSTKXkvYF7sQpcjIIqLwZeV_pFglchM)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzU2OTUzMTctYTYwNWI2ZDktMTczZS00MWU2LWIwYzItMWZhMTY2MzQ3ZWJjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJhMmE1ZDI4NzkwYmI0MjM0MWFkNGQyZjM0MzQ0NjVkMzBjOWQ1ZDdiNDUzMGM4MDlkMDg2NWQ2OWEwNGU1MzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Xj189KzT3TH4aP-0dYFsOA_FcaJHkz3giRehyQwWL28)
This is what cookie contains
![image](https://private-user-images.githubusercontent.com/30603497/275687860-63622179-0729-4005-94b2-bb182dcc9c6d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzU2ODc4NjAtNjM2MjIxNzktMDcyOS00MDA1LTk0YjItYmIxODJkY2M5YzZkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVhY2M2OGE0YTNkNjZjYTlhY2M1NzZiNTE5NjE2MTgwYTJiMGM3YzkwYWJkMDY3ZjUzMjkzN2QxYTM2MGE3MzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.jCATjXt7XzIJJkqXGD6W-iYSFWDSyyeXz2EL3QykxtM)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDMyNDMtNmZiYTY0MTctOWQzNi00NmMzLWFjYTYtMWUzN2FkYTYxNzAzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUxNjBkOGJjN2E1MWZlMmRjZDQ0OWU2ODExNTk1MDIxMmJmYWYyMmZlZjk5MDg3ZmM3NTM1ZjU5MjQ2MjBlMmQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.aiZCxgFrRecpkxllHQDCoqogkyIxK6Sb_Hs3YRSVKrw)
It is handled by RemoteAuthenticationHandler
.
![image](https://private-user-images.githubusercontent.com/30603497/275708723-9560406a-76b6-4b84-8631-3cdf9938810c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzU3MDg3MjMtOTU2MDQwNmEtNzZiNi00Yjg0LTg2MzEtM2NkZjk5Mzg4MTBjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU1YjE3OTVkNGMyNzJhMGNjYzU3YTE1ZWE1ZjY0Y2VkODhlYTRiMzE0ZWMzMDNjNGIwNmM3YzAyYTE2OGQyNjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.bSVGPumLrtXL_Na9shqTSDsD56Ka13mVW-fMb7aVvqk)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTI4NTktOGM4OWVhYzgtMmI1Zi00YWUwLTg4NDAtOTRkYTViZDBlM2JkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZkYWIzZDM5NTEwODk0Y2U0MmNmNzdkM2EwZjEyMDIwMTc3NzgxMzE5ZWM5NDg3YWNjNTVhYzczZjAwZGI3OGYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Y9iTygzgTLNwkhBRbaTRUL1XLpNN3fcNa1-gXY5akzA)
See how IAuthenticationHandler
looks like:
![image](https://private-user-images.githubusercontent.com/30603497/275287437-01b3b931-2628-4f28-a25a-3143f2f34503.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyODc0MzctMDFiM2I5MzEtMjYyOC00ZjI4LWEyNWEtMzE0M2YyZjM0NTAzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA4YmI1OGVkZjE5MGVlNjgxNzdlZTI3Nzc0OGMzOThmNjhhZGJiMDMwMGJhZjBiZmExYmZjMGVlMjA5ZTA5MTAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.fx19tAcb-fmmqY59MsgVv6wHBhfvjjp0FnbUblURAtI)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDQ0ODEtOTU4ZTk0ZGUtMGFiYy00ZDIzLTkwZTgtNDI3MmVkZGU1YTZhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThlZjZkZTQyNWJiNjJiMDBlMDc0ZjNjZTZhMjE5N2FhOGMwZmVjZjMwZTVhNjViZmZkYzNlNzMwODE1OGQ2NDMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.VGrsxooFx6MttovgT1bOl45hoIPamD3EDnwjBXURKfw)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTI5MDMtOTliYmM3ZDgtMjdjMi00YzVmLTg3Y2QtNzJjN2ZlNzFlZjg0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZlYzczODA1MDI1MTZiYzI0NjZhZTcwYjdjOTgzMmVlY2FkNDM0M2IwMDFmMjJlZWUyM2Q4MzY5ZGFmZDMwZjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.o-GTlABog9DlkeawtbXv0gvSAwFpTY9kknouZjUqKEM)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTI5MzctZGFjMTYxNTUtN2MyOS00MTNjLThmNWItOWRhYzMyN2RjMmRlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQwYTA1ZGRiYjRmZGQ4ZGJhNWExMzVmYmJmMTNmYWVhM2I3MGQ4ZDMzYjNjNjI3MTA0YjVjZjY1MTZhYTdmYjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.m2OANRulVKKHf-aLARSgd-yDeedMtSEtEx1d4MkMpIE)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzMzg4MzAtNmRhYWY1MDEtMTgwNC00ZjI2LTgwN2MtNWVlZTYxNzA1ZmUxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZlYmRiY2IwMjc1MGM3YjBmMGZiZGIzOWMwZjhmYmRhNjAwNDg3NmY5ZjdhMDFlMjdlY2I4MGU4N2ZhOGVlMjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CaQY_MVMTjFLtlpEtz8Hlsv_LQU54PuX_CNx3nIfpyA)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTMxMTctYzI4NDRlMjItOTNlYy00NzRjLTliNWUtZmVkNWE4OTdkODFiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI0YjVhNGE0ZGEzNDE3NTQzYWE4MzJiNGE0ZDUwYThlMDFjYjk2MTkwZmViNTM3M2U5MjEwZWEzNzJiZWNmZWYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.c-81sJuH66oSmdG0SbQtNRtnwhxBM7TSbqyNeJlRmwk)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTMyNDktNjAxOWQ0YmItYzBhMC00MzBiLThiY2YtYmM3YmVlMDA3YmJkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdhNTY3Zjc2NmI5NzA3NTQ5NzBkNjZhOTFmZTFiNWQyMjRiYWMwMzViODAwNjg3OWZhNWQwMTIxMjA4NWYwMWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.IhWkK3KogcDezP6QrEbW6egVlaThhSfW7GyeHN-TT7k)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUyOTM3ODMtZTAxOGQ5YTctODhjZC00NDQzLWJkMTgtYjc3ZDY5ZGExMWJkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWUyZDA0Y2NhMDI5NTA0ODBjODM4YmUxOThkNjY1MWIzZjE5YTQxNzNjYWZkOTU2Mzc3MTlmZDM4NTRhYzcyNzYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.AaJKk63utbLxxDd0yBKp_MLwfhFhdgL7ZCV678G_bGE)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDE4OTItYzRkMDI4MWQtZWUyOS00ODg2LTkwZWYtZjkyMzUzNzM4NWY2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTAwODFjNjgwZGIwYzIzMzc0ZjdlY2Y2NDE5Nzk4YTNlMjM4ZjIyMjNmMjA3Y2NjYzY0OGUwYTUxNzc5MmFmY2QmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.2x1wjlyWYwwrZ6CFUtg39KIl_iezAirt1KvOplS8bwI)
To here:
![image](https://private-user-images.githubusercontent.com/30603497/275341922-a358222d-cc17-4d80-9a1f-016f35cc496e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDE5MjItYTM1ODIyMmQtY2MxNy00ZDgwLTlhMWYtMDE2ZjM1Y2M0OTZlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE0MzZkNzc1MmJiZDc0NDM2MDEwN2YzOWRiNTAyODIzYWRmZDU5MWQyNTZmZTFjMzBmMDQ0MGM1NWM3ODkxNGImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hXjDYNB_ifYTL6nd__4-5x26hhqvz2N0viEUelk3DPk)
To here:
![image](https://private-user-images.githubusercontent.com/30603497/275341951-d94e3e07-8435-4c39-83e9-70ef66b7756b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDE5NTEtZDk0ZTNlMDctODQzNS00YzM5LTgzZTktNzBlZjY2Yjc3NTZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRjYmU2ZmQxMmVmMjg2YWQwMDRjMGVmMTg0ODM5NTZhY2Q1NDc1MDZkZjcxZDk0OTA4ZTE2MzhhNmZiOTNkZjYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.QkN3NgQhcTHVZi72eKA2nFh0w585kuGSFN_6b5bccb0)
To here:
![image](https://private-user-images.githubusercontent.com/30603497/275341977-3e122c7a-0322-4b8b-8bd0-042a56f09b2b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDE5NzctM2UxMjJjN2EtMDMyMi00YjhiLThiZDAtMDQyYTU2ZjA5YjJiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTkwOTliYzhhOTU1MmRjN2Q1MDExOTJiZmM0Y2E2MmNhMTBjNmZlZWZmMmVmNWRmYTM5ZmIxODM4YzA0ZWM5OGYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.pZjeZhU0gmNGnenEqGUwuylSaCX1XTbVZwu2s3fA8Ig)
To finally here:
![image](https://private-user-images.githubusercontent.com/30603497/275342011-ec95dcf2-9209-4801-a89d-2aab2f50428c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDIwMTEtZWM5NWRjZjItOTIwOS00ODAxLWE4OWQtMmFhYjJmNTA0MjhjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThiMjZmNmUyZjcyNTIyODdlN2IyNjAyNjBkMmJjZjBjYzhlYzdmOTBiMjRlZDIzNGE1ZWRlOGVmZTgyNzNmNTAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CNJNdhvRm4z21rut5vNr1tOCGdLVyE7WpT3ctiPZnx0)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDIxMjgtMjMwZDllMTMtMWU3OC00ODkyLTlmZjMtODg3N2ExMGI1NzRiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg5NjcyOTZkOTg4YjYzMDc3OTZhYTdjMzFjMWY4MTIwMDg5ZDc0ZTc0NjIyNTNiOThmYjM2ZjgzYWUxMWZlMTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.dwSvHhQgr9Qb8WdJHabGWUmgCJQAQU0U3YcTwzn8Rso)
It just calls .AuthenticateAsync
on the AuthenticationService
:
![image](https://private-user-images.githubusercontent.com/30603497/275342149-c11a1bbe-131d-4777-98b3-9910f34cdfba.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDIxNDktYzExYTFiYmUtMTMxZC00Nzc3LTk4YjMtOTkxMGYzNGNkZmJhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRjNTczNWMxNjczMDZmYTMwN2ZhYzM0OWNjMzNkZGY0YWEyOWFhZTBlYjU2ODU1N2NmMjBmNWVkNmExOGQ0YWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ZwZAOvmagWMBjcy1w1xXe4YqzRW8Wu0iUF0e6_-H8Os)
See the SchemeName and Handler:
![image](https://private-user-images.githubusercontent.com/30603497/275342609-d7220f34-d95e-437b-8fe6-ed7c2be51555.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDI2MDktZDcyMjBmMzQtZDk1ZS00MzdiLThmZTYtZWQ3YzJiZTUxNTU1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc0ZGY1YTk5YTgxZTcyMGZkMDhiZTZhN2FlNDdiMmRiOTA0YmE4NjI4MjAxZjBiMzIwMjZlZjI2MDdhYWNmMzImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.f_MvK1Nb5MtdkNduPeq1Fjmc_GIsDfXW-qI36FrRf9U)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDI3MTItNWI0ZTMxMDktM2FhYy00MDMwLWI1ODMtMTI5ZjE4YWI2Mjk1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYxMTFhZTdhYTQ3MDk4OTBkMDk2NzlmNzNlZGQyYTlmYzE0OWRjZWMzYWM4NTU5Yjg0Yzk2MGRkN2YxNGZlODgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.tcIoH6W2JZUF64uRjxJ9ADItVARGHT-vN2cx1iFbSnk)
Then into AuthenticationHandler
's AuthenticateAsync
method:
![image](https://private-user-images.githubusercontent.com/30603497/275342965-360f549f-e8a6-400e-aebc-346496e29b9f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDI5NjUtMzYwZjU0OWYtZThhNi00MDBlLWFlYmMtMzQ2NDk2ZTI5YjlmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWUwNzEyYmM3OTk4MDVlMWYxZGVhYjgyMjNlMGQ1MDEzNWRlNjMzNzZlNmI2MTQ5ODg5MDlmNDQwYzNkNTRlMGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.6XX9J41SFaB_cwDEEaywsyfulYdK5ynkEfunpL8jYQI)
Then into AuthenticationHandler
's HandleAuthenticateOnceAsync
method:
![image](https://private-user-images.githubusercontent.com/30603497/275343069-2d5fb0e8-a0ff-4826-b38a-0d44b87f0f67.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDMwNjktMmQ1ZmIwZTgtYTBmZi00ODI2LWIzOGEtMGQ0NGI4N2YwZjY3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI5ZjhiNWY2ODViZjZiY2ZhZDJkZTViZTZjZjdhNjY4YzNhN2ZjYzRiZTJjMmUzYWM0MWM3M2VhOTRkNDBjOGImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.AR1Dhrab1aF-25p2ndpWiCt01aI3tLRBdHy8MPUMDvA)
Then into AuthenticationHandler
's HandleAuthenticateAsync
method:
![image](https://private-user-images.githubusercontent.com/30603497/275343145-00c8d5d7-062c-4266-8fb9-4d66c5c5e52d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDMxNDUtMDBjOGQ1ZDctMDYyYy00MjY2LThmYjktNGQ2NmM1YzVlNTJkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdmMzg5Y2I4Mzg4ODkzMGIyOTZiNGQ5MTc4M2E3NTYwODNmNGU4Njc2NjdjZmI4NGFkMGI5MzRmNDQ5OGMyYTcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.f-EzirTk5Z3V9ZYCX1nv2OekuPxUV6QVHpXnDBOswc4)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDMyOTEtYjkxZGVkZTMtODg5YS00MzFjLWI1ODYtMWRlODc3YmIxYWQ4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU5ZTMwMjYwNWUxNDZiODIzZmFmZTJhODY0NzI4YWE3MTc3ZWQxYjZiZTMwMjE5OWQ4MDY3ZDBmZGU5NDcyMWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hJcmdvVOD4EXGVS29rcSTYK853ZXgixAvcA_Kbv_XVI)
Then we finally get this result:
![image](https://private-user-images.githubusercontent.com/30603497/275343415-cf863f30-b60b-4605-809f-c653cab8b4da.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDM0MTUtY2Y4NjNmMzAtYjYwYi00NjA1LTgwOWYtYzY1M2NhYjhiNGRhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTgyZjUyMWM5Y2E5MDVmYTk3Yzk0MjE5ODY5YTNhZTdjYzE1MTgwNTgyNGI2ZjM5OWRkNGUwZjExYWY5ZWQ0ZmMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.VgorbSvJVHP41VYkw1-MmJ7awDyXNNr-_z0cNo9p-RQ)
The schemes the app has:
![image](https://private-user-images.githubusercontent.com/30603497/277503300-36b17dc7-1a95-4cbe-98a7-b5bfd6e140bf.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDMzMDAtMzZiMTdkYzctMWE5NS00Y2JlLTk4YTctYjViZmQ2ZTE0MGJmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTEyNTcyM2I5YjQxNTBkMjUwZjljODY5NGRhZTcxMWY2NTY2Y2E4YzZjMmQwNjc5ZmRiNTU3ZGU5OWI2YjI1ZWImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.PsyyDOLD2NPrI6FEB3xHKB8Cmnrxtyc-TFpTsYeXiUQ)
ExternalLoginPicker.razor
shows the external logins:
![image](https://private-user-images.githubusercontent.com/30603497/277503648-c6b90469-acf2-4317-b0d1-1e44ca7ce5ab.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDM2NDgtYzZiOTA0NjktYWNmMi00MzE3LWIwZDEtMWU0NGNhN2NlNWFiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVkYTljNTJlZWE3NGRjMzIxY2ZjYTliMTYyMDFhZjYyMzc0YzY0Yjc3YTY2Y2JhYzgxMDE5YmMzZWE4MTBiYzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.a_UJqSsoACUBtnXaph0xYQ5llu2L87y1_XtCku5HI_A)
![image](https://private-user-images.githubusercontent.com/30603497/275347776-917e57cb-8608-433d-b6d0-3de029224c29.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzUzNDc3NzYtOTE3ZTU3Y2ItODYwOC00MzNkLWI2ZDAtM2RlMDI5MjI0YzI5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIwNGIwMmRhYmQ0NGU2ZTA5NjA5YjFjMGZlZTU0YmMwODQ5M2ZhZjhmNmMxYzg1MzdiYjQ2YWQ0YWExOWI4NjUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Pu9xuRPtx9NtSlVAJqxw1K52bhc-5LoK-dT6AKc8U44)
This will call the POST endpoint:
![image](https://private-user-images.githubusercontent.com/30603497/277504359-9b59d135-20b7-4400-bce6-8f917add9f66.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDQzNTktOWI1OWQxMzUtMjBiNy00NDAwLWJjZTYtOGY5MTdhZGQ5ZjY2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdmMzFlNTgxM2M1NWJmMDk2OGIxNmUzNzQzNWI3ODc3M2ZlODI1OWE1ZGM5ODgxYzc0YzdlYTQ2NjAzOTA1Y2MmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.IIU_36cWBmAyARWwUA8zTl1idhQ82zMRTrFOLsc-3FY)
/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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDU0MjUtMTgzYzUwNjEtN2Q5ZS00ZDkxLTkyM2MtZjJhYzkxMWJiODkxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQxMWY3ZGEzMmNjNzQ0MDBkOWZlMjBhZWU4MGM2ODdmODYzNmNiZjBlNGQyMDhkOTRkZGI5MWJlODJiNjU1MWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.weXrXAyqrjCehKW3yUFjrOdjY8BVU-Mssmoc9mXr0CU)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDU2NjMtMWQ1YjFlMDctZWVjZC00N2IyLTg0YjgtN2IyNjg3YzdmNGY4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY5ZDljNzA2NTQ1YWEyZDRiMmQxZGIwZGYxYzZiZTI1N2YzODYyNDQxZTM4NjljZTg1YTAyZmZhNTZmMzAzZmYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.JgrFDiFQgruwYlkHeO4GM_gIg-539nDdJ5DaAd_EMPU)
![image](https://private-user-images.githubusercontent.com/30603497/277505874-6636b1d2-e371-4546-98b5-560ece855a0b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDU4NzQtNjYzNmIxZDItZTM3MS00NTQ2LTk4YjUtNTYwZWNlODU1YTBiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM1MmE4ZDhiYTkyZDQzYjQyNmRhOWVhZmVhMjg0OWEyMzU5NDQyYzQwNWU5OWM4YTk2MGEyYTgyOWQzNTRiMDYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.2cHDK1yRj6nQ60G6WbrP5XU7Ecuju8s95sENC3tQYZM)
Now we're in OAuthHandler.cs
![image](https://private-user-images.githubusercontent.com/30603497/277506480-e614aba9-b0ea-41d3-8414-216683697b1a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDY0ODAtZTYxNGFiYTktYjBlYS00MWQzLTg0MTQtMjE2NjgzNjk3YjFhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNkNzY0NDNjY2FiZGQ5MDg4OWVmZWI5OGQ4NTg1OTE5ZmZiODA3ZDdjN2ZmZjAxYjEyZjZhN2QxMDVmNWZlZWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.AuxrhLTnR7jpjFqaTFJa7A363TEnJY_vEYMT96UzJ1w)
![image](https://private-user-images.githubusercontent.com/30603497/277506580-cb1144bd-c697-40fb-951d-f6d7c050d3fd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDY1ODAtY2IxMTQ0YmQtYzY5Ny00MGZiLTk1MWQtZjZkN2MwNTBkM2ZkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVjOWRiMTQxZDNlYWY0ZGZlNDJkNTVlYzBiMDc3ZWQwZDEyNDhiOGY0NGE2YzMzNjM0NTQ3YWVmNWIwNDA5NzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.GtRQDcHnxYJB06L5PTLyZ3VJuNVycPVzWzevrnyTMQ0)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDcxMjgtNTA1MzhhYTUtMDY0MS00MzRhLWFlMTAtMmUyMDZjYjA4NDgxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWJmMWNlNTM0ZWMzNzlmY2E1ZGRmZjQ5MDc2MTYyNDUxZjFkMzFjNGZlYjdmNjA0M2JkY2E1ZDMzN2RiYTlhYjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ywkCKyRBNTpk8pThHf9wvaYJq2981Y_C_EKkFtlXfTM)
So the app goes to that location:
![image](https://private-user-images.githubusercontent.com/30603497/277507460-6c1de721-730c-4a9b-9212-f1c0d37c5f34.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDc0NjAtNmMxZGU3MjEtNzMwYy00YTliLTkyMTItZjFjMGQzN2M1ZjM0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTgwNWUwMzY5NDJmZWUyNmY0OTNjNDFjZjk1ZGU5NmEwYjg4OWU3NjE5MWI4Y2ZjOTA2YjU3MGEwZTVkMDFmZTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ZimCIWfjcyCCK49lDxHBBQgETlSE8BEP1-tFtdNoQNA)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDc2MDEtYjAwYWU1Y2ItODA0OS00ZjA0LWE2NmEtNzAyOGRjMDVjMzBlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU4MDk2NGJkYTY1MzYwODg2MDQxODU1OWQ3MjZkYWIyOTk1NTU0OWQyZDYyNWRlN2FiYmFlZGMxZTdhZjEwMDMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.65fcAE_ECYN5eh-Miw2KxpbOZ69RxK2ra3xFm6Qn8yo)
![image](https://private-user-images.githubusercontent.com/30603497/278841054-bd2a2f49-ec27-484c-ac78-4c8d2fc1f1fb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDEwNTQtYmQyYTJmNDktZWMyNy00ODRjLWFjNzgtNGM4ZDJmYzFmMWZiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE1ZDQ4MmNhYmI2YTY1YWMzMTRiMmIyNzEzNmM1ZmRiNGM4MTYwODg5NjAwOTNkYjUxYjczNzdmMThmNGNlYjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.mNqKR_Z6Dugd9ilSiPuPGwaP15iAGUNH3M5O3mVAdSI)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDA3NjAtNDE4ZGU1NTAtOGY5YS00ODliLWI0NjYtNWM2ZTZkMDY1YzcyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE4NTQ1YThiOTUzYWE4NTExOGRmYjFlNjcyNDFlN2QyYTFlNDYxOGU5NjI0MTg0MThkYWQ1ZTZhNGIzMGJjZGYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.yqCLmVnjsvJpto_Nq4abJvojlk2984t085S_S4toiog)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDg3MjItZjhjODI0NjYtNTVhYy00Yjk3LWE4YmEtNTMzZGYxMTY1ZDU3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThkMzdjZmZhOTVjYzAyYTA2ZTFlOGViN2Q4MDMyNDVlZmEwNDMzNjk0OTZlODEyOGU3MGY5M2Q5NmNlZjkwYTkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ukFhvCLDwIGZrP0sD3t-lEqAHFjok9Uu4LmpZj6Tprc)
The query has code and state.
![image](https://private-user-images.githubusercontent.com/30603497/277508599-e5d61a96-0f32-492a-a095-68ce34382dac.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDg1OTktZTVkNjFhOTYtMGYzMi00OTJhLWEwOTUtNjhjZTM0MzgyZGFjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk0ZTZhZmUyYzgwMjA2ZGE5ZDQ3OTRkYmMyZTIzNDMyZDY0ZWVlNWZhN2NjNGQ3NGE5ZGJiNGQ2NzM4M2MxMzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.wAHYDgBFr1l-kddgFsz0TGEJ3ek_IlZs78xo29gSgN8)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MDkzMTgtNDg1MmY4M2UtYWY4Ni00OTgzLTk3YmUtZjc5MzUyZWY1MmMwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU1YmJiNGFjNTE3MzQxNjdhMWRhZDZiMDJjMjRiOWUzZjRlNjFjMzk0ODY1YTJmZjRlNGMwZDlkYTYzYTNhYmUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.XkK6-qBTsnRla6vQdWg4s5EYB4OQKoA8ptKU6feVTuk)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTAwMjMtNTFkYzM5MzktYmJkMS00MmU5LTljNGYtMTRiNWMwY2ZmOWFjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc4ZTRjNjVhZDMwNWI0OGZkNDg5YzEwMGJmY2RlNTNlYWZjYTI2N2I0MzE4ZDVkNGE4NzY2ZjgyZmI3NzEzYWEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.0eA7xAlx8q1H4pP0kWdIM_hoSk1ActCdcw_ms7r4Ywk)
Dummy identity is created:
![image](https://private-user-images.githubusercontent.com/30603497/277510467-3aa27088-72af-4dfd-9549-8c84b5115e72.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTA0NjctM2FhMjcwODgtNzJhZi00ZGZkLTk1NDktOGM4NGI1MTE1ZTcyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVjOTNmMTAxMjQ5NDIxMzQ3NTk3Y2I1NjNiZmViNDU0OGNhZWE2NmRkNmFhMjIyNzI0NzIzNGI4YzI4ZDliOTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ouU2MwT7WFVjyppR0a66MbRxAFwlaC-FIAsQsX2q4Io)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTEzNjgtOTQ4MjcyNmUtOTJjOS00OTdmLWFlOGYtZjM4MjFhMDhlMmM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTkxZmZjZjdhYmMzNTExYWI3ZTU1MDc3YzljZTQwNzA3OGVlMzgxMjcyOGY5NWY1NzNkNWMxY2Y5YWVhMzRhMTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0._FEH75Y8ZBKYwqIHBNLPDjmvaRpE247ezcgTtp0KZWg)
By calling this callback:
![image](https://private-user-images.githubusercontent.com/30603497/277511734-d5a31a96-1eee-42b3-a171-cff98e00b9eb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTE3MzQtZDVhMzFhOTYtMWVlZS00MmIzLWExNzEtY2ZmOThlMDBiOWViLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVlYThmZmRjY2ZmYjEwN2QyMzExNDJiZTgyZmJhODJkZTU4Njc5YzM3Y2VkYzc3Y2JiYjQ2ZDQ2MjcyYTgxNDkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.cZVLQr5cva631_xw6oYrZ4jOR8_1QOfY0BuPErQVO2s)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTIxOTEtZGVkMDNiODgtM2M4YS00YWIyLWJkNTEtMjY4MDg3Y2RmYTI2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThkMGU1NTQzZjllMzE0ZGZiZmIyMTc0NDU5MTVmNTE0NTMxOGU4Y2MzYzJhZWQyYzliYTJkMzBjZGU0MzMyNDEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Vo4URkkRh8GJFdMwEtBR-CBmat6MN8BPw79pyXiUtwQ)
In RemoteAuthenticationHandler.cs
![image](https://private-user-images.githubusercontent.com/30603497/277512385-a7b6a17e-93c6-437e-8172-3cc725d8d117.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTIzODUtYTdiNmExN2UtOTNjNi00MzdlLTgxNzItM2NjNzI1ZDhkMTE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc4NWI3ODBiNDAzNzcyYWIxYWQyMTNmMDE3MjVhN2RiMjlkYzFkZWEwYjlkYjZlYzZjODlmNGZhMjcwNWU2MjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.y0ZRnbnO1_ALnxm9mRJogHn0WDin56pcliLMm5aAyGY)
The Principal
looks like this:
![image](https://private-user-images.githubusercontent.com/30603497/277512592-efdedcb0-6096-4fa7-a64b-1f2d06639284.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTI1OTItZWZkZWRjYjAtNjA5Ni00ZmE3LWE2NGItMWYyZDA2NjM5Mjg0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJmMmM1ZDI3ZWViOGJhMGZlNWI0MjhlMWYyYWNiNmJjOTQyYTc0NzRhMjRmOGM1NWE5ZjQyODVhYjEwMzIwODkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.WUDPxu5uC58JlRY_uFnYFwIVm9rSJnoRImT5ZtkaeLw)
And the properties:
![image](https://private-user-images.githubusercontent.com/30603497/277512669-a7bd09e9-05fb-45d0-98e4-103c85f26f2e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTI2NjktYTdiZDA5ZTktMDVmYi00NWQwLTk4ZTQtMTAzYzg1ZjI2ZjJlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTllYjk3OGQwNDc4MTBiMDVmYmQ3Y2FiMDhjODgwZmZhODBkZGU3YjBmMWYzYjdlYzI0ZjA4MDIyY2Y3MTIzYTYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.1jizyg_xU-RXCRYHvdkYTUKet6zarabYWI8sPu5QMbQ)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTM0MzgtNTM4MjhmZDQtYjQ0YS00MWY4LTkzZmQtOGFkYmExNzQzMDViLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdiMzY4ZmI1N2RiYmVmMjRkZjMyMTY4Y2NiZGViYTE4ZDY3M2IxNjlhNGZiYTc4NjQ5MDk1NGU4NTkyYWRhMzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.UIAtnT0MA95mGolKAUEyB-cY9OFcIMRrTt7Z9iz855Q)
A new ticket is created:
![image](https://private-user-images.githubusercontent.com/30603497/277513620-62d52eda-c8be-4219-984a-b71f6faab16c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTM2MjAtNjJkNTJlZGEtYzhiZS00MjE5LTk4NGEtYjcxZjZmYWFiMTZjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJkMWFkN2I3YTQ2ZTQ4OGM1NjczYjBiODc2M2I4OGFlODllODJlN2YxYmJkMWFkYTg4N2IwODIyZTRkMzVhZDImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.SXV1RyHD7POcjuAaB11MtOG4UbsudO89ZlJZkmhgE3U)
![image](https://private-user-images.githubusercontent.com/30603497/277513684-abf50c5c-5ea2-4739-8e05-b798d41d05c6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTM2ODQtYWJmNTBjNWMtNWVhMi00NzM5LThlMDUtYjc5OGQ0MWQwNWM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRkMmYwNWMwZTMyNzQ3ZTIzYTJhZTZjYmYyOGRkYTViNzNjNjRmM2Y4NTVhYmNlODZiOGQ0NTgyYzA0NDMyNzImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CiV1EPYWLYJ1JKdVxUDZi-kxkn3d868E9dHkH7qOwTk)
![image](https://private-user-images.githubusercontent.com/30603497/277513727-5ecc20bb-a5e3-464e-a676-578c37762deb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTM3MjctNWVjYzIwYmItYTVlMy00NjRlLWE2NzYtNTc4YzM3NzYyZGViLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU4YzlkZjAxYWJmMGM2NzUwMzIyMDQ5ODg0ZjkwNmQ3ODIzZjBjMjk3MzZmMDdlNzE1N2U0MmIwMzZkM2U0YzUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.OUTIR5d_s_2Wy6CWzpNV_kVStQTpLXmhrJCVfmsu2Ek)
The method completes:
![image](https://private-user-images.githubusercontent.com/30603497/277514241-799879be-724c-4365-b775-b967b1015f42.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTQyNDEtNzk5ODc5YmUtNzI0Yy00MzY1LWI3NzUtYjk2N2IxMDE1ZjQyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE0ZWVlYmE4ZTJlYjM2NWQwZTRlMzgxYTg4Y2VhZmEwNDY4M2M3MTI3NjcwNjllNGVjMmZlMDE4Njg3YjU2OGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.tMBpfo718Y9zdyC9NIdjMNBZfttc-mWHN6Swr_MYzDQ)
This method also completes:
![image](https://private-user-images.githubusercontent.com/30603497/277514402-691d6e9b-8a80-42b8-9235-b92dffeba3a3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTQ0MDItNjkxZDZlOWItOGE4MC00MmI4LTkyMzUtYjkyZGZmZWJhM2EzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU0Njg4Yjg0Y2JhZTA2ODFkMzY3OTBlMGE3NmQ4ZWY1NzlmMzYxMzg5MDk4MzcyNjdkNThjNTQ2YjM0OTBiZWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.kcmq5gfTn76j8MRc5pZuoSREEXUnxL682d2dtGQDwS0)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTQ2NDYtY2U1OTE1OWUtYzMyZC00MDVmLTk5MGItMDM2MTJjOWM1MDQ0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY4YmJmZjliYTRmNjRkYWFjNWE5ZDdmZTZlODU1ZTliODIyMTQ2MmVhYWNkNmVjMzRhN2JjMDg1NzNlOWUwOGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0._9JsGnaIf0tPv-pDlQX8y1t3ysfbUYr9Ms6fT64iM5A)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTUyMzItM2RiOThjMTAtZDVkNS00ODM3LWI4MTAtYTlhMzg5YWU4YzNhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIyM2E5ODMzNjRhYThkODQ0N2E3ZWFmNWE0MzU4MDc0YWNjNjJjNDAxMjRjMDZlMjRkYzMyYzcyYjZiNGUzMDMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.N_vl9PE_gk-BAbPMnpO56AUqvG5TNd3zd18ecaeT5Ag)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDExNjktYjE5NTkxYzgtNDdjMC00YmFlLWFhODMtMzFkYWQ4NGM3ZTQ3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWNlYTljMGZmNzkwMjA5YjUxNDA2NzE5MTE5ZjdiOTI4NTQ1YzYwMDQ5NzZmYWVjYTg3NTM4NTFlOTcwNDViMTYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.S87R0lfNN3pGbLI3mgYhZ2ESNy3XwSaQJytSXKtoqjE)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTU3NzUtOWZmNzdhMGMtZTNlNS00ZWM4LThjNGEtMGY1ZTZlOTIyOTVhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA2YjQ3NjYwZGRkYzJjY2Y2MmFkZTIxOWI3YjZiZjM3NWIyOGY4MzE3NGQ1YWU2YjMxOGQzNjhjMmJmMzA2MzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.07bJFBp1oEIVx5lpFP74sZydb36lUU51AzN5nJVskz8)
Now we have userinfo:
![image](https://private-user-images.githubusercontent.com/30603497/277519290-e535c97e-68c2-40e7-b87c-c1cee4169963.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTkyOTAtZTUzNWM5N2UtNjhjMi00MGU3LWI4N2MtYzFjZWU0MTY5OTYzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI1MjAyN2M0NzQzNzU3Njg0YWE1MGZmOWVmNzFiZWFmYzVjNDEzYzhlNzBmNjNhZDkxOGI5ODNiM2NlNDY5ZGYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.9IMwhxtVvHDSiajHD5uFIylESydS4lokPl4GtoSdXRY)
![image](https://private-user-images.githubusercontent.com/30603497/277519405-44fce317-969a-4447-ad47-8efd62f17e99.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTk0MDUtNDRmY2UzMTctOTY5YS00NDQ3LWFkNDctOGVmZDYyZjE3ZTk5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ2YzI1YzIzZDBmODI2NmI1YzU5MDAwMGU3OWY4YWRhNjcyNTI5MmZlNDQyMjcyZWNhOTQwNTQzNjk4ZWJmOWEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.d7YYpwQaj0QZXX1uydhu1ZBGDXCCk1OpacFc2AazABA)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE5OTItM2QwNDMxMjEtOTQ2ZC00NGY2LWFhYTUtZjcwYTkzMTZmYWE2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNlNTBhOGQ1MTE4OGM4ZmZkOTIwZjRmNGUxZDZiY2NmZTg4ZWRlODgxYTI0MjEyOTQ1YmRmZWFkZjJhMTYxOWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.-ZDQzasx2wmWXL9T7vwuPqE6J09ePsxDjso8KU-XV7M)
Here:
![image](https://private-user-images.githubusercontent.com/30603497/278842120-f403c022-4976-46ec-a90b-0187b309a244.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDIxMjAtZjQwM2MwMjItNDk3Ni00NmVjLWE5MGItMDE4N2IzMDlhMjQ0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWFlZjI3OTJjMmQwODAyYmY2ZGVkOWZlZjlhZjI4MWU1MjQwOTkzZTgwYjYyMDBhYzBlOWNhMDM5MWI5NmQyMjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ZhHL5UZ1SFDGEQeig76NgvwsiVuKZSOzrzOuHlU1pRM)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDIxOTMtOTUwM2ZlODAtYWI0YS00ZWZhLTg0M2ItZDBmYzBjYzAxMjBmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJkMWY0MTJhZjYwZDM5Yjc2ODdiYTRmM2YzOTlkN2MyYmVlNmY4MzU4N2I4ZjE5NWY3OWI5N2E3MjkyZjdjOWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.pzk0a1D6enu58JwUpPeRrZW-4iz6rLLLPWdM0nqT908)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzc1MTg0NzUtNGZlMDllYTctN2NmZC00YTdhLWFjOGItZjQ0MDFiMGZmODI4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQzMWM5MGZmY2Y3YWQyMWEzNjFmOTMxNGE3Mzc4YTgwNTNhN2VmZWYxNDg4NDM5Y2NkNWFjNGE1MWFiYTliZmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ayOnktz7h6fe0n2ncGIMPWa0TS0nuproG4S0atQgejQ)
Here:
![image](https://private-user-images.githubusercontent.com/30603497/278840028-fcd8d092-a4a9-4721-8cbd-47e2fbe10dc0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDAwMjgtZmNkOGQwOTItYTRhOS00NzIxLThjYmQtNDdlMmZiZTEwZGMwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU4MjY5NjBiZGUxMDNmODI1ZTQwZDZmMjg5ODQxNWU5NjJhZWNhMGFkNDk0MDE0YThjMTg0NzhkZDdmNmMyNTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.38_-f40xOvYdGyTsAc8JdjpLrW-uGFSeePyJNg2p_34)
The action in the query is this:
![image](https://private-user-images.githubusercontent.com/30603497/278841261-008bb985-d0a1-409a-b738-3fe277cc2fde.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDEyNjEtMDA4YmI5ODUtZDBhMS00MDlhLWI3MzgtM2ZlMjc3Y2MyZmRlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTkzZGYyYTgzM2U3ZTYzZjA1NDUyMGMyNTI3NzU3MjYxY2RlNDRlMzBmNWFjNjBiNmZjOWE2ZTJkMDkyZjBiYzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.uBfR6pcG37gcf58vbgS-08vMCfuI-rWn9QwVSeIQcTI)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE1NDgtNDViMjA3ZDEtYWQwZC00NDdjLWE1YWEtZTNkZDY5NDk1ZWM4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI5ZWViMjE3NjMzOTE5ODYzM2ViNjc5YzZlZTE5YzFjYzAwY2M5ZjQzODlhZmY4YWZjZDM2NTJmYTEzYzdmZjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.klroctG6sRXhjtR3puqzXZVjuiK-z8wFzED769Bo688)
Like here:
![image](https://private-user-images.githubusercontent.com/30603497/278841574-bec7b97d-53de-4a31-b4d8-bbfc44e812e4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE1NzQtYmVjN2I5N2QtNTNkZS00YTMxLWI0ZDgtYmJmYzQ0ZTgxMmU0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFkYTlhOWI2MDZiODAxZjhhNTA4MDQyMjVmYjYzOWYyNjUzMDNiNDk4ZWI0YTYzOTliNWVmY2I2NTFjZmQ0NjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.PQsQRPy6ZDYUbKMrsra3-M6zqrGsvtt9j8Wr1u8GkFY)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE1ODYtYWM4NmM0YWUtMmYwMC00ZWRlLThjOGMtM2ZlNTlhMDFjMzhmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA4ZTIzNmNhNzJkYmI4MzZkMmY2YzgwM2EyMmE3NDVmZjk0NTgzYTQxZWYzNjZhYWU0ZmZkMzAwZmFiM2VhYTkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.62I1kX6I5h1pEus6eGzpnUfo148QvjT-Piqt3-fkj9c)
![image](https://private-user-images.githubusercontent.com/30603497/278841607-82cda3b4-1fc5-47b2-a308-acce45d1a7d1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDE2MDctODJjZGEzYjQtMWZjNS00N2IyLWEzMDgtYWNjZTQ1ZDFhN2QxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJlMTYxMTM1ZTRkMTA5Nzg3MmVkZWE5YWEyYjk4ZmU1ZTUzMWJkMzI0ZTM4MWM3MjJiNDNkNzAzMTQwZWNmYjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.o4OZ3S2iL3Mw1fH9d5KutgDpi4DiNpBZXBEZ3UCLm88)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDIyOTItMDAwMzFlOGYtNzhiNy00MmVjLThmZGYtNGU5OGQyMWQ0NTYzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU0MGRlNDIxM2E4NGY2OTgzOTFmOGMyZTg0OTlmZjE4ZjcwMmZjYmNlOWJhNjNiZWNjNGVjMmU4YjM0MmE1MDMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.EyC7KKzBC3oulhjcx3iOPOv_faYBY_yMnrvuGX7Q8Vo)
And Signin primary cookie:
![image](https://private-user-images.githubusercontent.com/30603497/278842325-4365d496-9cdd-44ea-a2a4-f32d41524a13.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDIzMjUtNDM2NWQ0OTYtOWNkZC00NGVhLWEyYTQtZjMyZDQxNTI0YTEzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ5ODhiZjY4NjY1MWQzNjUwNDJhNmNlMTdlZWQzYjU5YjE0YjVhNmM4ZDQ4YjVmZDMxNDY5M2M2OGM0OTdmZTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.DflfI8HPgtMb2cj_tPqjJpBz8RUQyknP1t4h8EEqyDQ)
By calling this method:
![image](https://private-user-images.githubusercontent.com/30603497/278842477-21eba0ce-135c-4d40-963b-9606f31b81b5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI0NzctMjFlYmEwY2UtMTM1Yy00ZDQwLTk2M2ItOTYwNmYzMWI4MWI1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIzNGIzN2M5NzA3MThlODBmM2EwZTY3ZjM2OTYxNTU1MjMwZmJiMzNiZTE4NjgzZjk0ZjVhNWIwYzVmNjRiYzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.0Qt_cPZ00EWi8-a2SASbahXAzn0etlz9nGWVa4Az95k)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI1MzItZGJjYzU1MmMtMjk1Ny00ZjVmLWE2ZTUtNjg3M2M2YjZlNDEyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVlMDdiOGFjMDBiNDRmOGM5NzQ5MTBhODM3NDY3NDk3NzI3NWMyOWRhMmIyOTBhNDJkODA1ZDhiYjg3MzVkY2UmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ZJtxtzHhIfKDy4TQrpBz7BtmjdSo0WibBCmMGT00SL4)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI2MTMtOGRjZWU3NjYtZDA5Ny00OWYwLWFhYzMtZTk1MDM5ZGMxNGZmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJlOTNhNjA2ZDk2YzM2ZTMyOTY3YjRlYjAwZTgwNGE4NjM1ZjYxYWU3ODQ0OTQwYjkwNTYxOTIxZTE5YWI1N2UmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.jSCEanVl-2F7uHMI-XbdSyycWAHY-P7bDBOUOtX5oHE)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI2NDctYjczZWEzMzQtMTRkOC00YjMxLTg1NTgtNDFhNzQwODIxNmU5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVlZTI0NTBkZGUyMzA0ZDVlNzA2NGEzYzk0ODM4NmQ1ZTQ4YzgzZmQ0NGQwYTEyNTU5ZGVjNjEzOTk2ZjMwODAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.iWYi_86F_KEnx_QayGTUTArROfqYHLcOoN_vWeJKHI0)
We get to homepage now.
![image](https://private-user-images.githubusercontent.com/30603497/278842837-9bdb9062-226e-4bc0-9d19-a92595277f75.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI4MzctOWJkYjkwNjItMjI2ZS00YmMwLTlkMTktYTkyNTk1Mjc3Zjc1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA3ZWI3NGFlY2EyNTgyZDM1OWIwN2Y5ODZlZmM4YjVhYjMyYmQ5NzY5N2ZiOGExZjU3OWZhYzBkOTk1ZjdkY2YmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.evxRgRdOLDZCVfIz-YwHMx5oLFOiIp-104Pl82PjOuU)
Like this:
![image](https://private-user-images.githubusercontent.com/30603497/278842868-cc1483b7-ac6f-4bf0-bcab-8443825008fa.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI4NjgtY2MxNDgzYjctYWM2Zi00YmYwLWJjYWItODQ0MzgyNTAwOGZhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQwNjhiMmE5MTdkZmY0ZGVkZWY4YTA0YThlOWJkMDNkNTA2MmNhN2YxYWFlZGNmZDBkOGVkYjM1ZDdlOWRhM2EmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.1Ok-nGD05W1Dp7mVBnXGRl3pK6Ri7Lnbj47mbyQwL5Y)
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI4ODMtMDFkZDU1MWYtNjU3YS00Yjk4LWI2MmMtNDdlOWM0ZDRkZDkxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWExZThjMzRmNTM1ZDUwZjkzNGY0MDEzYWRkNTdjN2Y5NzVlMzlmY2VjZTMwMjBmMzZiMTEyM2Y1MGIwNWU2NDAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Bh54A5fxZZ7YsRwqJon0KeiOthhDJ9ebHqWIMKw79gc)
![image](https://private-user-images.githubusercontent.com/30603497/278842754-8c12158c-99c0-4f0d-a4ae-871f17846713.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI3NTQtOGMxMjE1OGMtOTljMC00ZjBkLWE0YWUtODcxZjE3ODQ2NzEzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE4MzNiM2Q2MzUwZDYyN2E2ZmQ4OTNhY2UyY2U1OTFjNmIyYjAzYTQyNzE3YTdmYzE3ODljMGViMTE4NTMyMGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Di6HBFhvNge79zve03qzxCvxKSLRCN5-Rbes6NtSbPg)
Success!
![image](https://private-user-images.githubusercontent.com/30603497/278842764-661fd65a-2a37-4e3c-9947-9d5b2b07aea7.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3NjE3NjAsIm5iZiI6MTczOTc2MTQ2MCwicGF0aCI6Ii8zMDYwMzQ5Ny8yNzg4NDI3NjQtNjYxZmQ2NWEtMmEzNy00ZTNjLTk5NDctOWQ1YjJiMDdhZWE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDAzMDQyMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc3ZTg5NTdlYmM3YjI0OWU1NjFhOGE3MzE0NTI4NjRmNDg1YThkMDk0MjY4NzRjMzg1MzZiZmRhNGFjYjIyYjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.zc9rzkdjidhwXrh8jwghLliPU9kecRBX2h8eLUG6vGM)