[{"data":1,"prerenderedAt":1151},["ShallowReactive",2],{"i-feather:search":3,"i-feather:x":8,"i-feather:moon":10,"i-feather:sun":12,"i-fa-brands:youtube":14,"i-fa-brands:twitch":18,"i-fa-brands:github":20,"i-fa-brands:linkedin":23,"i-fa-brands:stack-overflow":26,"i-simple-icons:bluesky":29,"i-fa-brands:mastodon":31,"i-fa-regular:envelope":33,"i-fa-solid:rss":35,"post-\u002Fazure-active-directory-versus-identity-server\u002F":37,"post-navigation":746,"i-fa-solid:share-alt":1131,"i-fa-brands:facebook":1133,"i-fa-brands:twitter":1135,"i-fa-brands:reddit":1137,"i-fa-brands:patreon":1139,"i-simple-icons:buymeacoffee":1141,"i-fa-brands:paypal":1143,"i-fa-regular:question-circle":1145,"i-feather:arrow-left":1147,"i-feather:arrow-right":1149},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003Cpath d=\"m21 21l-4.35-4.35\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 12.79A9 9 0 1 1 11.21 3A7 7 0 0 0 21 12.79\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"5\"\u002F>\u003Cpath d=\"M12 1v2m0 18v2M4.22 4.22l1.42 1.42m12.72 12.72l1.42 1.42M1 12h2m18 0h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":15,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":17},576,512,"\u003Cpath fill=\"currentColor\" d=\"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597c-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821c11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305m-317.51 213.508V175.185l142.739 81.205z\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cpath fill=\"currentColor\" d=\"M391.17 103.47h-38.63v109.7h38.63ZM285 103h-38.63v109.75H285ZM120.83 0L24.31 91.42v329.16h115.83V512l96.53-91.42h77.25L487.69 256V0Zm328.24 237.75l-77.22 73.12h-77.24l-67.6 64v-64h-86.87V36.58h308.93Z\"\u002F>",{"left":4,"top":4,"width":21,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":22},496,"\u003Cpath fill=\"currentColor\" d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2\"\u002F>",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":25},448,"\u003Cpath fill=\"currentColor\" d=\"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5c0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7c-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5c67.2 0 79.7 44.3 79.7 101.9z\"\u002F>",{"left":4,"top":4,"width":27,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":28},384,"\u003Cpath fill=\"currentColor\" d=\"M290.7 311L95 269.7L86.8 309l195.7 41zm51-87L188.2 95.7l-25.5 30.8l153.5 128.3zm-31.2 39.7L129.2 179l-16.7 36.5L293.7 300zM262 32l-32 24l119.3 160.3l32-24zm20.5 328h-200v39.7h200zm39.7 80H42.7V320h-40v160h359.5V320h-40z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":30},"\u003Cpath fill=\"currentColor\" d=\"M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037c-.856 3.061-3.978 3.842-6.755 3.37c4.854.826 6.089 3.562 3.422 6.299c-5.065 5.196-7.28-1.304-7.847-2.97c-.104-.305-.152-.448-.153-.327c0-.121-.05.022-.153.327c-.568 1.666-2.782 8.166-7.847 2.97c-2.667-2.737-1.432-5.473 3.422-6.3c-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026\"\u002F>",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":32},"\u003Cpath fill=\"currentColor\" d=\"M433 179.11c0-97.2-63.71-125.7-63.71-125.7c-62.52-28.7-228.56-28.4-290.48 0c0 0-63.72 28.5-63.72 125.7c0 115.7-6.6 259.4 105.63 289.1c40.51 10.7 75.32 13 103.33 11.4c50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.5 102.5 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7c56.12-6.7 105-41.3 111.23-72.9c9.8-49.8 9-121.5 9-121.5m-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175c25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5l11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1c23.71 27.3 18.4 53 18.4 175z\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":34},"\u003Cpath fill=\"currentColor\" d=\"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48m0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49c-16.841 13.247-50.201 45.072-73.413 44.701c-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646c21.857 17.205 60.134 55.186 103.062 54.955c42.717.231 80.509-37.199 103.053-54.947c49.528-38.783 82.032-64.401 104.947-82.653V400z\"\u002F>",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":36},"\u003Cpath fill=\"currentColor\" d=\"M128.081 415.959c0 35.369-28.672 64.041-64.041 64.041S0 451.328 0 415.959s28.672-64.041 64.041-64.041s64.04 28.673 64.04 64.041m175.66 47.25c-8.354-154.6-132.185-278.587-286.95-286.95C7.656 175.765 0 183.105 0 192.253v48.069c0 8.415 6.49 15.472 14.887 16.018c111.832 7.284 201.473 96.702 208.772 208.772c.547 8.397 7.604 14.887 16.018 14.887h48.069c9.149.001 16.489-7.655 15.995-16.79m144.249.288C439.596 229.677 251.465 40.445 16.503 32.01C7.473 31.686 0 38.981 0 48.016v48.068c0 8.625 6.835 15.645 15.453 15.999c191.179 7.839 344.627 161.316 352.465 352.465c.353 8.618 7.373 15.453 15.999 15.453h48.068c9.034-.001 16.329-7.474 16.005-16.504\"\u002F>",{"id":38,"title":39,"author":40,"body":41,"comments":616,"date":711,"dateModified":712,"description":713,"extension":714,"headings":715,"heroImage":736,"meta":737,"path":738,"permalink":738,"published":739,"stem":740,"tags":741,"timeToRead":745},"posts\u002Fposts\u002F2016\u002Fazure-active-directory-versus-identity-server\u002Findex.md","Azure Active Directory Versus Identity Server","Muhammad Rehan Saeed",{"type":42,"value":43,"toc":613},"minimark",[44,70,101,104,119,128,131,145,153,163,177,180,194,197,211,214,228,231,245,248,251,265,268,271,352,366,369,383,386,400,403,416,419,433,436,449,452,465,480,489,503,506,519,522,560,574,586,593,607,610],[45,46,50,56],"div",{"className":47},[48,49],"custom-block","warning",[51,52,55],"p",{"className":53},[54],"custom-block-title","Disclaimer",[51,57,58,59,69],{},"I looked into this subject for use by the company I work for, who had existing infrastructure I had to cater to, so the solution I chose is skewed in that direction. Even so I've tried to give an impartial summary of my own thoughts during my research. I originally asked this question on an Identity Server GitHub ",[60,61,68],"a",{"href":62,"rel":63,"target":67},"https:\u002F\u002Fgithub.com\u002FIdentityServer\u002FIdentityServer3\u002Fissues\u002F2116",[64,65,66],"nofollow","noopener","noreferrer","_blank","issue",".",[71,72,75,81],"h1",{"id":73,"data-section-heading":74},"azure-active-directory","",[76,77,80],"span",{"className":78},[79],"heading__text","Azure Active Directory",[82,83,86],"anchor-link",{"href":84,"label":85},"#azure-active-directory","Link to this section",[87,88,95],"svg",{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink","0 0 16 16","1.1",22,"true",[96,97],"path",{"fill":98,"fill-rule":99,"d":100},"currentColor","evenodd","M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z",[51,102,103],{},"Azure Active Directory is a hosted identity solution, so there is far less setup (especially if like me, you discover that to your surprise, you are already using it for Office 365). Out of the box, it provides some very nice features that can get you started very quickly.",[105,106,108,112],"h2",{"id":107,"data-section-heading":74},"on-premises-active-directory",[76,109,111],{"className":110},[79],"On-Premises Active Directory",[82,113,115],{"href":114,"label":85},"#on-premises-active-directory",[87,116,117],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,118],{"fill":98,"fill-rule":99,"d":100},[51,120,121,122,127],{},"Azure Active Directory can connect to an on-premises Active Directory server very easily using something called ",[60,123,126],{"href":124,"rel":125,"target":67},"https:\u002F\u002Fazure.microsoft.com\u002Fen-gb\u002Fdocumentation\u002Farticles\u002Factive-directory-aadconnect\u002F",[64,65,66],"Azure AD Connect",". Most companies are not running everything in the cloud and have an on-premises AD server, so this is a pretty big killer feature.",[51,129,130],{},"Syncing the two directories happens transparently but there are a bunch of things that can be configured like the way passwords are synced. I'm not a system administrator so I've not set this up personally but most IT admins can do this pretty painlessly.",[105,132,134,138],{"id":133,"data-section-heading":74},"connect-health",[76,135,137],{"className":136},[79],"Connect Health",[82,139,141],{"href":140,"label":85},"#connect-health",[87,142,143],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,144],{"fill":98,"fill-rule":99,"d":100},[51,146,147,148,152],{},"The premium edition of Azure Active Directory has a monitoring and reporting capability called ",[60,149,137],{"href":150,"rel":151,"target":67},"https:\u002F\u002Fazure.microsoft.com\u002Fen-gb\u002Fdocumentation\u002Farticles\u002Factive-directory-aadconnect-health\u002F",[64,65,66]," so you can see who is logging into your system and when. You can also get alerts for any seemingly nefarious activity, like a report on the top 50 users with failed username and password attempts, as well as a report on whether Azure AD is syncing correctly with any on-premises AD server you might have. It's a pretty nice feature for IT Admins, while others might not care too much about it.",[51,154,155],{},[156,157],"img",{"alt":158,"src":159,"width":160,"height":161,"loading":162},"Azure Active Directory Connect Health","\u002Fcontent-images\u002Fposts\u002F2016\u002Fazure-active-directory-versus-identity-server\u002Fimages\u002FAzure-Active-Directory-Connect-Health.png",782,575,"lazy",[105,164,166,170],{"id":165,"data-section-heading":74},"two-factor-authentication",[76,167,169],{"className":168},[79],"Two-Factor Authentication",[82,171,173],{"href":172,"label":85},"#two-factor-authentication",[87,174,175],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,176],{"fill":98,"fill-rule":99,"d":100},[51,178,179],{},"The premium edition has two factor authentication built in right out of the box, so no having to setup a text message provider, plus the costs of sending those messages are included out of the box.",[105,181,183,187],{"id":182,"data-section-heading":74},"cloudflare-for-identity",[76,184,186],{"className":185},[79],"Cloudflare for Identity",[82,188,190],{"href":189,"label":85},"#cloudflare-for-identity",[87,191,192],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,193],{"fill":98,"fill-rule":99,"d":100},[51,195,196],{},"Microsoft is monitoring all logins and actively blocks activity from known attackers (a bit like cloudflare for identity), so it should in theory provide some added security. There is not much detail about this though.",[105,198,200,204],{"id":199,"data-section-heading":74},"managing-users",[76,201,203],{"className":202},[79],"Managing Users",[82,205,207],{"href":206,"label":85},"#managing-users",[87,208,209],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,210],{"fill":98,"fill-rule":99,"d":100},[51,212,213],{},"You can manage users from the Azure portal but the UI is just about passable. If you are using Office 365, you're in a better position as it provides a better UI to manage users.",[105,215,217,221],{"id":216,"data-section-heading":74},"ui-customization",[76,218,220],{"className":219},[79],"UI Customization",[82,222,224],{"href":223,"label":85},"#ui-customization",[87,225,226],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,227],{"fill":98,"fill-rule":99,"d":100},[51,229,230],{},"Customization of the UI is very basic. You can provide a company logo and background image, which get displayed on the login screens but that's about it.",[105,232,234,238],{"id":233,"data-section-heading":74},"developer-experience",[76,235,237],{"className":236},[79],"Developer Experience",[82,239,241],{"href":240,"label":85},"#developer-experience",[87,242,243],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,244],{"fill":98,"fill-rule":99,"d":100},[51,246,247],{},"The overall developer experience is pretty slick. Creating a new project in Visual Studio lets you enable integration with Azure AD by just logging in using your Azure credentials and selecting your Azure AD account. It doesn't get any easier than that for simple scenarios.",[51,249,250],{},"For more complex scenarios, you will inevitably have to log into the Azure Portal and configure things a bit more. You often end up having to download and edit an XML configuration file from the Azure Portal. This is not the best experience in the world.",[105,252,254,258],{"id":253,"data-section-heading":74},"overall",[76,255,257],{"className":256},[79],"Overall",[82,259,261],{"href":260,"label":85},"#overall",[87,262,263],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,264],{"fill":98,"fill-rule":99,"d":100},[51,266,267],{},"You have to pay for the premium features and using the Azure Portal to do identity management is kind of a pain. Out of the box though this is ridiculously fast to setup and can get you up to speed very quickly, while giving you a secure platform.",[51,269,270],{},"The documentation is pretty good and there are samples on GitHub with Microsoft developers actively monitoring the issues which was helpful. Some links I found useful:",[272,273,274,282,289,296,310,324],"ul",{},[275,276,277],"li",{},[60,278,281],{"href":279,"rel":280,"target":67},"https:\u002F\u002Fazure.microsoft.com\u002Fen-gb\u002Fdocumentation\u002Farticles\u002Factive-directory-whatis\u002F",[64,65,66],"Documentation home page.",[275,283,284],{},[60,285,288],{"href":286,"rel":287,"target":67},"https:\u002F\u002Fazure.microsoft.com\u002Fen-gb\u002Fdocumentation\u002Farticles\u002Factive-directory-authentication-scenarios\u002F",[64,65,66],"Documentation for each type of authentication flow.",[275,290,291],{},[60,292,295],{"href":293,"rel":294,"target":67},"https:\u002F\u002Fazure.microsoft.com\u002Fen-gb\u002Fdocumentation\u002Farticles\u002Factive-directory-code-samples\u002F#server-or-daemon-application-to-web-api",[64,65,66],"Samples covering every authentication flow.",[275,297,298,299,304,305,69],{},"Introduction ",[60,300,303],{"href":301,"rel":302,"target":67},"https:\u002F\u002Fchannel9.msdn.com\u002FShows\u002FAzure-Friday\u002FAzure-Identity-101-Vittorio-explains-Federation-and-the-basics-of-Azure-Active-Directory",[64,65,66],"video 1 (Channel 9)"," and ",[60,306,309],{"href":307,"rel":308,"target":67},"https:\u002F\u002Fchannel9.msdn.com\u002FShows\u002FAzure-Friday\u002FAzure-Identity-102-Vittorio-creates-a-Windows-Azure-Active-Directory-in-Azure",[64,65,66],"video 2 (Channel 9)",[275,311,312,315],{},[51,313,314],{},"Build 2016 videos:",[272,316,317],{},[275,318,319],{},[60,320,323],{"href":321,"rel":322,"target":67},"https:\u002F\u002Fchannel9.msdn.com\u002FEvents\u002FBuild\u002F2016\u002FP423",[64,65,66],"Business-to-Consumer Identity Management with Azure Active Directory B2C",[275,325,326,329],{},[51,327,328],{},"Build 2015 videos:",[272,330,331,338,345],{},[275,332,333],{},[60,334,337],{"href":335,"rel":336,"target":67},"https:\u002F\u002Fazure.microsoft.com\u002Fen-gb\u002Fdocumentation\u002Fvideos\u002Fbuild-2015-azure-active-directory-identity-management-as-a-service-for-modern-applications\u002F",[64,65,66],"Azure Active Directory Identity Management as a Service for Modern Applications",[275,339,340],{},[60,341,344],{"href":342,"rel":343,"target":67},"https:\u002F\u002Fazure.microsoft.com\u002Fen-gb\u002Fdocumentation\u002Fvideos\u002Fbuild-2015-develop-modern-web-applications-with-azure-active-directory\u002F",[64,65,66],"Develop Modern Web Applications with Azure Active Directory",[275,346,347],{},[60,348,351],{"href":349,"rel":350,"target":67},"https:\u002F\u002Fazure.microsoft.com\u002Fen-gb\u002Fdocumentation\u002Fvideos\u002Fbuild-2015-develop-modern-native-applications-with-azure-active-directory\u002F",[64,65,66],"Develop Modern Native Applications with Azure Active Directory",[71,353,355,359],{"id":354,"data-section-heading":74},"identityserver",[76,356,358],{"className":357},[79],"IdentityServer",[82,360,362],{"href":361,"label":85},"#identityserver",[87,363,364],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,365],{"fill":98,"fill-rule":99,"d":100},[51,367,368],{},"IdentityServer is the Swiss Army knife of Identity management. It can do everything but does require a small amount of setup and a little more knowledge of the identity space. It can do most things that I listed above and a lot more beyond.",[105,370,372,376],{"id":371,"data-section-heading":74},"multiple-identity-sources",[76,373,375],{"className":374},[79],"Multiple Identity Sources",[82,377,379],{"href":378,"label":85},"#multiple-identity-sources",[87,380,381],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,382],{"fill":98,"fill-rule":99,"d":100},[51,384,385],{},"IdentityServer can connect to one or more identity sources. It has to be noted that even if you are using Azure Active Directory, there may still be reasons for choosing IdentityServer which I had not initially considered. For example, if you have more than one source of user data e.g. You are using AD and also a SQL database of users, then IdentityServer can be used to point to both of these sources of user information. In theory it should also make it easier to switch from AD to something else entirely as it decouples things.",[105,387,389,393],{"id":388,"data-section-heading":74},"application-insights",[76,390,392],{"className":391},[79],"Application Insights",[82,394,396],{"href":395,"label":85},"#application-insights",[87,397,398],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,399],{"fill":98,"fill-rule":99,"d":100},[51,401,402],{},"It's possible to integrate Application Insights yourself and record things like logins and password resets. You could build a dashboard of graphs which looks like Connect Health. In fact, you can make it look exactly like Connect Health with very little effort.",[105,404,406,409],{"id":405,"data-section-heading":74},"two-factor-authentication-1",[76,407,169],{"className":408},[79],[82,410,412],{"href":411,"label":85},"#two-factor-authentication-1",[87,413,414],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,415],{"fill":98,"fill-rule":99,"d":100},[51,417,418],{},"Two-Factor Authentication requires a third party provider to send text messages and of course this means that there will be a monetary cost. In addition there is a small amount of code you have to write to get things connected.",[105,420,422,426],{"id":421,"data-section-heading":74},"use-cloudflare",[76,423,425],{"className":424},[79],"Use Cloudflare",[82,427,429],{"href":428,"label":85},"#use-cloudflare",[87,430,431],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,432],{"fill":98,"fill-rule":99,"d":100},[51,434,435],{},"Azure Active Directory provides some built in support for blocking malicious activity, a bit like Cloudflare but for identity. With IdentityServer, you could use the real Cloudflare and get some added protection for very little effort.",[105,437,439,442],{"id":438,"data-section-heading":74},"ui-customization-1",[76,440,220],{"className":441},[79],[82,443,445],{"href":444,"label":85},"#ui-customization-1",[87,446,447],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,448],{"fill":98,"fill-rule":99,"d":100},[51,450,451],{},"UI customization is where IdentityServer shines. You have full access to the HTML and CSS and can fully customize the look and feel to your hearts content.",[105,453,455,458],{"id":454,"data-section-heading":74},"developer-experience-1",[76,456,237],{"className":457},[79],[82,459,461],{"href":460,"label":85},"#developer-experience-1",[87,462,463],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,464],{"fill":98,"fill-rule":99,"d":100},[51,466,467,468,473,474,479],{},"IdentityServer is built by ",[60,469,472],{"href":470,"rel":471,"target":67},"https:\u002F\u002Fleastprivilege.com\u002F",[64,65,66],"Dominick Baier",", ",[60,475,478],{"href":476,"rel":477,"target":67},"https:\u002F\u002Fbrockallen.com\u002F",[64,65,66],"Brock Allen"," and the open source community. I actually did a WCF course under the instruction of Dominick many years ago and I can tell you that IdentityServer is in capable hands.",[51,481,482,483,488],{},"Any questions or issues you have would be posted on the relevant ",[60,484,487],{"href":485,"rel":486,"target":67},"https:\u002F\u002Fgithub.com\u002FIdentityServer",[64,65,66],"IdentityServer GitHub"," project. Dominick, Brock and other community members often answer questions. Overall, it's run as a healthy open source project.",[105,490,492,496],{"id":491,"data-section-heading":74},"microsoft-backing",[76,493,495],{"className":494},[79],"Microsoft Backing",[82,497,499],{"href":498,"label":85},"#microsoft-backing",[87,500,501],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,502],{"fill":98,"fill-rule":99,"d":100},[51,504,505],{},"Microsoft has attempted to build their own identity provider in the past but the solution wasn't the best. Having embraced open source, they now recommend IdentityServer themselves.",[105,507,509,512],{"id":508,"data-section-heading":74},"overall-1",[76,510,257],{"className":511},[79],[82,513,515],{"href":514,"label":85},"#overall-1",[87,516,517],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,518],{"fill":98,"fill-rule":99,"d":100},[51,520,521],{},"The project is actively developed on GitHub and it has well known developers at the helm. There are code samples for all the authentication flows and you can get answers from the community. Some links I found useful:",[272,523,524,531,537,545,553],{},[275,525,526],{},[60,527,530],{"href":528,"rel":529,"target":67},"https:\u002F\u002Fgithub.com\u002FIdentityServer\u002FIdentityServer4",[64,65,66],"IdentityServer4 GitHub home page.",[275,532,533],{},[60,534,295],{"href":535,"rel":536,"target":67},"https:\u002F\u002Fgithub.com\u002FIdentityServer\u002FIdentityServer4.Samples",[64,65,66],[275,538,539,544],{},[60,540,543],{"href":541,"rel":542,"target":67},"https:\u002F\u002Fgithub.com\u002FIdentityManager\u002FIdentityManager",[64,65,66],"IdentityManager GitHub home page"," (A separate application for handling users, groups and roles).",[275,546,547,552],{},[60,548,551],{"href":549,"rel":550,"target":67},"https:\u002F\u002Fgithub.com\u002FIdentityServer\u002FIdentityServer3.Admin",[64,65,66],"IdentityServer Admin GitHub home page"," (A tool for managing clients and scopes).",[275,554,555],{},[60,556,559],{"href":557,"rel":558,"target":67},"https:\u002F\u002Fvimeo.com\u002F154172925",[64,65,66],"Introduction video at NDC 2016 (Vimeo).",[71,561,563,567],{"id":562,"data-section-heading":74},"authentication-flows",[76,564,566],{"className":565},[79],"Authentication Flows",[82,568,570],{"href":569,"label":85},"#authentication-flows",[87,571,572],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,573],{"fill":98,"fill-rule":99,"d":100},[51,575,576,580,581,585],{},[577,578,579],"strong",{},"Fact",": Security is really really hard. There are lots of different ways of doing authentication called 'flows'. I put ",[60,582,584],{"href":286,"rel":583,"target":67},[64,65,66],"this link"," here because I found it very useful for understanding them. Also, the following diagram is key to understanding this entire topic.",[51,587,588],{},[156,589],{"alt":566,"src":590,"width":591,"height":592,"loading":162},"\u002Fcontent-images\u002Fposts\u002F2016\u002Fazure-active-directory-versus-identity-server\u002Fimages\u002FAuthentication-Flows.png",791,340,[71,594,596,600],{"id":595,"data-section-heading":74},"summary",[76,597,599],{"className":598},[79],"Summary",[82,601,603],{"href":602,"label":85},"#summary",[87,604,605],{"xmlns":89,"xmlns:xlink":90,"viewBox":91,"version":92,"width":93,"height":93,"aria-hidden":94},[96,606],{"fill":98,"fill-rule":99,"d":100},[51,608,609],{},"What you decide to choose depends entirely on the problem you have. Which should you choose? Well, it depends on the number of developers, time, money and effort you can expend setting everything up. There is no one size fits all solution. Really, the differences in the two products above are the differences between a SaaS and PaaS solution.",[51,611,612],{},"Which did I choose? While I was doing this research, I discovered to my surprise that the company I work for already had an Azure Active Directory linked to an on-premises Active Directory server because we were using Office 365. That made the choice much easier for us.",{"title":74,"searchDepth":614,"depth":614,"links":615},2,[],{"issue":617,"comments":621},{"number":618,"title":619,"html_url":620},59,"[Comment] Azure Active Directory Versus Identity Server","https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59",[622,634,642,650,658,666,674,682,694,702],{"id":623,"html_url":624,"body_html":625,"created_at":626,"updated_at":626,"author_association":627,"user":628,"reactions":632},627247961,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-627247961","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fb84381a789673f65540ebb7595d8a8f0bf19f60cd2bdfa5fc473488ccffdd1d8\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30323465333136643530663963366434613930306564353730356530303839643f733d393626643d6d6d26723d67\">\u003Cimg alt=\"coder1\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fb84381a789673f65540ebb7595d8a8f0bf19f60cd2bdfa5fc473488ccffdd1d8\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30323465333136643530663963366434613930306564353730356530303839643f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>coder1\u003C\u002Fstrong> commented on \u003Cstrong>2016-06-03 21:24:07\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>digital fonts used in headers are very strong and strain eyes which are already exhausted from programming and this might trigger migraine sometimes\u003C\u002Fp>\n\u003Cp>would u rather mind to try other font plzzz\u003C\u002Fp>\n\u003Cp>great post\u003C\u002Fp>","2020-05-12T10:13:12Z","OWNER",{"login":629,"avatar_url":630,"html_url":631},"RehanSaeed","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2270364?v=4","https:\u002F\u002Fgithub.com\u002FRehanSaeed",{"url":633,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627247961\u002Freactions",{"id":635,"html_url":636,"body_html":637,"created_at":638,"updated_at":638,"author_association":627,"user":639,"reactions":640},627248033,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-627248033","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F066743b5cae041ce1ddf5fa8d1b8bab9f3a5e8647337b380eb8050cf66ed35a8\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39653564316633363134346362313839633134333262643763343230356231343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"CodeGrue\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F066743b5cae041ce1ddf5fa8d1b8bab9f3a5e8647337b380eb8050cf66ed35a8\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39653564316633363134346362313839633134333262643763343230356231343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>CodeGrue\u003C\u002Fstrong> commented on \u003Cstrong>2016-12-19 20:21:25\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Do you mean \"Two-Factor\" rather than \"Two-Factory\"?\u003C\u002Fp>","2020-05-12T10:13:20Z",{"login":629,"avatar_url":630,"html_url":631},{"url":641,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627248033\u002Freactions",{"id":643,"html_url":644,"body_html":645,"created_at":646,"updated_at":646,"author_association":627,"user":647,"reactions":648},627248112,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-627248112","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-12-21 09:05:49\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Do you mean \"Two-Factor\" rather than \"Two-Factory\"?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Fixed. Thank you!\u003C\u002Fp>","2020-05-12T10:13:28Z",{"login":629,"avatar_url":630,"html_url":631},{"url":649,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627248112\u002Freactions",{"id":651,"html_url":652,"body_html":653,"created_at":654,"updated_at":654,"author_association":627,"user":655,"reactions":656},627248179,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-627248179","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4842d1b1760b8984ae9411a6bf3a85dcacf90b6443afdfd5f969fef390221c2b\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31656337356433633936303738663134373332626639353166313339643831623f733d393626643d6d6d26723d67\">\u003Cimg alt=\"arthur\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4842d1b1760b8984ae9411a6bf3a85dcacf90b6443afdfd5f969fef390221c2b\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31656337356433633936303738663134373332626639353166313339643831623f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>arthur\u003C\u002Fstrong> commented on \u003Cstrong>2017-08-02 19:32:40\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>digital fonts used in headers are very strong and strain eyes which are already exhausted from programming and this might trigger migraine sometimes\u003C\u002Fp>\n\u003Cp>would u rather mind to try other font plzzz\u003C\u002Fp>\n\u003Cp>great post\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>i'll have to agree with that.\u003C\u002Fp>","2020-05-12T10:13:36Z",{"login":629,"avatar_url":630,"html_url":631},{"url":657,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627248179\u002Freactions",{"id":659,"html_url":660,"body_html":661,"created_at":662,"updated_at":662,"author_association":627,"user":663,"reactions":664},627248261,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-627248261","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F2e532b020353b3159533c2460ef6a40e7ede4468833bd3ca26e1b98f1f38ad5b\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39336332316437383665343762613131636634663537363930306464386465313f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Neil Billingham\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F2e532b020353b3159533c2460ef6a40e7ede4468833bd3ca26e1b98f1f38ad5b\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39336332316437383665343762613131636634663537363930306464386465313f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Neil Billingham\u003C\u002Fstrong> commented on \u003Cstrong>2017-10-27 16:54:48\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi, thanks for the post; do you have any references mentioning Microsoft''s backing for Identity Server?\u003C\u002Fp>","2020-05-12T10:13:44Z",{"login":629,"avatar_url":630,"html_url":631},{"url":665,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627248261\u002Freactions",{"id":667,"html_url":668,"body_html":669,"created_at":670,"updated_at":670,"author_association":627,"user":671,"reactions":672},627248328,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-627248328","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2017-11-13 09:14:35\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hi, thanks for the post; do you have any references mentioning Microsoft''s backing for Identity Server?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>If you've ever seen the ASP.NET Community Standup, this question has come up a couple of times and Damian Edwards has supported the use of Identity Server in this scenario. I'm not sure there is an online statement supporting this fact, of course Microsoft has their own competing product in Azure AD, so I'm not sure there would be anything overtly advertising IdentityServer.\u003C\u002Fp>","2020-05-12T10:13:52Z",{"login":629,"avatar_url":630,"html_url":631},{"url":673,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627248328\u002Freactions",{"id":675,"html_url":676,"body_html":677,"created_at":678,"updated_at":678,"author_association":627,"user":679,"reactions":680},627248391,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-627248391","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F358524f82442031ec47703e509ea48ddf9ec4c686bde58b53e1934f8dd6f56d5\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f62303631613863343034323136363139636436616538393935656337343563303f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Alex\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F358524f82442031ec47703e509ea48ddf9ec4c686bde58b53e1934f8dd6f56d5\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f62303631613863343034323136363139636436616538393935656337343563303f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002F-\u002F\">Alex\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2017-12-15 09:53:14\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>It seems that Scott Hanselman is promoting IdentityServer:\u003Cbr \u002F>\n\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fmva.microsoft.com\u002Fen-us\u002Ftraining-courses\u002Fintroduction-to-identityserver-for-aspnet-core-17945?l=oygMZtBPE_5806218965\">https:\u002F\u002Fmva.microsoft.com\u002Fen-us\u002Ftraining-courses\u002Fintroduction-to-identityserver-for-aspnet-core-17945?l=oygMZtBPE_5806218965\u003C\u002Fa>\u003C\u002Fp>","2020-05-12T10:14:00Z",{"login":629,"avatar_url":630,"html_url":631},{"url":681,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627248391\u002Freactions",{"id":683,"html_url":684,"body_html":685,"created_at":686,"updated_at":686,"author_association":687,"user":688,"reactions":692},634086838,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-634086838","\u003Cp>Isn't IdentityServer overcomplicated? I've chosen OpenIddict when looked for OpenID Connect server solution because I was not managed to figure out anything in Identity Server samples and it was not flexible enough with storing info. It didn't allow Guids instead of ints on top of Entity Framework Core\u003C\u002Fp>","2020-05-26T15:10:47Z","NONE",{"login":689,"avatar_url":690,"html_url":691},"xperiandri","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2365592?v=4","https:\u002F\u002Fgithub.com\u002Fxperiandri",{"url":693,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F634086838\u002Freactions",{"id":695,"html_url":696,"body_html":697,"created_at":698,"updated_at":698,"author_association":627,"user":699,"reactions":700},634098496,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-634098496","\u003Cblockquote>\n\u003Cp>Isn't IdentityServer overcomplicated? I've chosen OpenIddict when looked for OpenID Connect server solution because I was not managed to figure out anything in Identity Server samples and it was not flexible enough with storing info. It didn't allow Guids instead of ints on top of Entity Framework Core\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I haven't tried OpenIddict. I think of IdentityServer as a swiss army knife that can be configured to do most things.\u003C\u002Fp>\n\u003Cp>I believe it can be used to store GUID's. The default EF Core code just uses int's.\u003C\u002Fp>","2020-05-26T15:29:24Z",{"login":629,"avatar_url":630,"html_url":631},{"url":701,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F634098496\u002Freactions",{"id":703,"html_url":704,"body_html":705,"created_at":706,"updated_at":706,"author_association":687,"user":707,"reactions":708},634867692,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F59#issuecomment-634867692","\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002FIdentityServer\u002FIdentityServer4\u002Fblob\u002F768a0386408f4b85376d2d9a7156deceb9931f56\u002Fsrc\u002FEntityFramework.Storage\u002Fsrc\u002FEntities\u002FClient.cs#L15\">https:\u002F\u002Fgithub.com\u002FIdentityServer\u002FIdentityServer4\u002Fblob\u002F768a0386408f4b85376d2d9a7156deceb9931f56\u002Fsrc\u002FEntityFramework.Storage\u002Fsrc\u002FEntities\u002FClient.cs#L15\u003C\u002Fa>\u003C\u002Fp>","2020-05-27T18:47:58Z",{"login":689,"avatar_url":690,"html_url":691},{"url":709,"total_count":710,"+1":710,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F634867692\u002Freactions",1,"2016-05-20T00:00:00+00:00",null,"A comparison between Azure Active Directory and Identity Server covering the advantages and disadvantages of both.","md",[716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735],{"depth":710,"value":80},{"depth":614,"value":111},{"depth":614,"value":137},{"depth":614,"value":169},{"depth":614,"value":186},{"depth":614,"value":203},{"depth":614,"value":220},{"depth":614,"value":237},{"depth":614,"value":257},{"depth":710,"value":358},{"depth":614,"value":375},{"depth":614,"value":392},{"depth":614,"value":169},{"depth":614,"value":425},{"depth":614,"value":220},{"depth":614,"value":237},{"depth":614,"value":495},{"depth":614,"value":257},{"depth":710,"value":566},{"depth":710,"value":599},"\u002Fimages\u002Fhero\u002FAzure-Active-Directory-Versus-Identity-Server-1366x768.png",{},"\u002Fazure-active-directory-versus-identity-server\u002F",true,"posts\u002F2016\u002Fazure-active-directory-versus-identity-server\u002Findex",[742,80,743,137,358,744,169],"Active Directory","Cloudflare","IdentityServer4",6,[747,751,755,760,765,768,771,775,779,783,786,790,795,798,801,805,809,813,816,820,824,828,831,836,841,845,848,851,854,858,862,865,870,874,878,882,885,889,893,897,901,905,909,913,916,920,921,925,929,932,936,940,943,946,950,954,959,963,967,971,975,979,983,986,989,992,996,1000,1003,1007,1010,1013,1016,1019,1023,1027,1030,1033,1037,1041,1044,1047,1050,1054,1058,1062,1066,1069,1072,1077,1080,1083,1087,1090,1094,1098,1101,1105,1108,1111,1115,1119,1123,1127],{"title":748,"permalink":749,"heroImage":750,"timeToRead":710},"Just Start - The First Blog Post","\u002Fjust-start-the-first-blog-post\u002F","\u002Fimages\u002Fhero\u002FJust-Start-1366x768.png",{"title":752,"permalink":753,"heroImage":754,"timeToRead":614},"ConfigureAwait in Task Parallel Library (TPL)","\u002Fconfigureawait-task-parallel-library\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-.NET-1366x768.png",{"title":756,"permalink":757,"heroImage":758,"timeToRead":759},"Stop The Brace Wars, Use StyleCop","\u002Fstop-brace-wars-use-stylecop\u002F","\u002Fimages\u002Fhero\u002FStyleCop-1366x768.png",3,{"title":761,"permalink":762,"heroImage":763,"timeToRead":764},"Reactive Extensions (Rx) - Part 1 - Replacing C# Events","\u002Freactive-extensions-part1-replacing-events\u002F","\u002Fimages\u002Fhero\u002FReactive-Extensions-1366x768.png",4,{"title":766,"permalink":767,"heroImage":763,"timeToRead":759},"Reactive Extensions (Rx) - Part 2 - Wrapping C# Events","\u002Freactive-extensions-part2-wrapping-events\u002F",{"title":769,"permalink":770,"heroImage":763,"timeToRead":614},"Reactive Extensions (Rx) - Part 3 - Naming Conventions","\u002Freactive-extensions-part3-naming-conventions\u002F",{"title":772,"permalink":773,"heroImage":774,"timeToRead":759},"WPF Metro Part 1 - Modern UI for WPF","\u002Fwpf-metro-part1-modern-ui-for-wpf\u002F","\u002Fimages\u002Fhero\u002FModern-UI-for-WPF-1366x768.png",{"title":776,"permalink":777,"heroImage":778,"timeToRead":759},"WPF Metro Part 2 - MahApps Metro","\u002Fwpf-metro-part2-mahapps-metro\u002F","\u002Fimages\u002Fhero\u002FMahApps-Metro-1366x768.png",{"title":780,"permalink":781,"heroImage":782,"timeToRead":759},"Windows 8.1 TouchScreen Gaming Laptops","\u002Fwindows-8-touchscreen-gaming-laptops\u002F","\u002Fimages\u002Fhero\u002FFry-Shutup-And-Take-My-Money-1366x768.png",{"title":784,"permalink":785,"heroImage":763,"timeToRead":759},"Reactive Extensions (Rx) - Part 4 - Replacing Timers","\u002Freactive-extensions-part4-replacing-timers\u002F",{"title":787,"permalink":788,"heroImage":789,"timeToRead":614},"WPF Metro Part 3 - Elysium","\u002Fwpf-metro-part3-elysium\u002F","\u002Fimages\u002Fhero\u002FElysium-1366x768.png",{"title":791,"permalink":792,"heroImage":793,"timeToRead":794},"WPF Metro Part 4 - Elysium Extra","\u002Fwpf-metro-part4-elysium-extra\u002F","\u002Fimages\u002Fhero\u002FElysium-Extra-1366x768.png",8,{"title":796,"permalink":797,"heroImage":763,"timeToRead":764},"Reactive Extensions (Rx) - Part 5 - Awaiting Observables","\u002Freactive-extensions-part5-awaiting-observables\u002F",{"title":799,"permalink":800,"heroImage":754,"timeToRead":794},"GetHashCode Made Easy","\u002Fgethashcode-made-easy\u002F",{"title":802,"permalink":803,"heroImage":763,"timeToRead":804},"Reactive Extensions (Rx) - Part 6 - Task ToObservable","\u002Freactive-extensions-part6-task-toobservable\u002F",5,{"title":806,"permalink":807,"heroImage":808,"timeToRead":710},"Portable Class Library (PCL) version of NotificationsExtensions NuGet package","\u002Fportable-class-library-version-of-notificationsextensions-nuget-package\u002F","\u002Fimages\u002Fhero\u002FNuGet-1366x768.png",{"title":810,"permalink":811,"heroImage":812,"timeToRead":804},"Model-View-ViewModel (MVVM) - Part 1 - Overview","\u002Fmodel-view-viewmodel-mvvm-part1-overview\u002F","\u002Fimages\u002Fhero\u002FMVVM-1366x768.png",{"title":814,"permalink":815,"heroImage":812,"timeToRead":764},"Model-View-ViewModel (MVVM) - Part 2 - IDisposable","\u002Fmodel-view-viewmodel-mvvm-part2-idisposable\u002F",{"title":817,"permalink":818,"heroImage":812,"timeToRead":819},"Model-View-ViewModel (MVVM) - Part 3 - INotifyPropertyChanged","\u002Fmodel-view-viewmodel-mvvm-part3-inotifypropertychanged\u002F",11,{"title":821,"permalink":822,"heroImage":823,"timeToRead":759},"Naming Conventions","\u002Fnaming-conventions\u002F","\u002Fimages\u002Fhero\u002FNaming-Conventions-1366x768.png",{"title":825,"permalink":826,"heroImage":812,"timeToRead":827},"Model-View-ViewModel (MVVM) - Part 4 - INotifyDataErrorInfo","\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002F",12,{"title":829,"permalink":830,"heroImage":793,"timeToRead":764},"Elysium Extra 1.1 Released","\u002Felysium-extra-1-1-released\u002F",{"title":832,"permalink":833,"heroImage":834,"timeToRead":835},"ASP.NET Core Boilerplate","\u002Fasp-net-mvc-boilerplate\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Boilerplate-1366x768.png",7,{"title":837,"permalink":838,"heroImage":839,"timeToRead":840},"Internet Favicon Madness (Updated)","\u002Finternet-favicon-madness\u002F","\u002Fimages\u002Fhero\u002FFavicons-1366x768.png",17,{"title":842,"permalink":843,"heroImage":844,"timeToRead":835},"Custom Visual Studio Project Templates","\u002Fcustom-visual-studio-project-templates\u002F","\u002Fimages\u002Fhero\u002FVisual-Studio-1366x768.png",{"title":846,"permalink":847,"heroImage":844,"timeToRead":759},"Configuration File Transforms In Visual Studio Should Be Built In","\u002Fconfiguration-file-transforms-in-visual-studio-should-be-built-in\u002F",{"title":849,"permalink":850,"heroImage":834,"timeToRead":819},"Securing the ASP.NET MVC Web.config","\u002Fsecuring-the-aspnet-mvc-web-config\u002F",{"title":852,"permalink":853,"heroImage":763,"timeToRead":614},"Reactive Extensions (Rx) - Part 7 - Sample Events","\u002Freactive-extensions-part7-sample-events\u002F",{"title":855,"permalink":856,"heroImage":857,"timeToRead":745},"NWebSec ASP.NET MVC Security Through HTTP Headers","\u002Fnwebsec-asp-net-mvc-security-through-http-headers\u002F","\u002Fimages\u002Fhero\u002FNWebSec-1366x768.png",{"title":859,"permalink":860,"heroImage":861,"timeToRead":93},"Content Security Policy (CSP) for ASP.NET MVC","\u002Fcontent-security-policy-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FContent-Security-Policy-CSP-for-ASP.NET-MVC-1366x768.png",{"title":863,"permalink":864,"heroImage":754,"timeToRead":804},"C# 6.0 - Saving Developers From Themselves","\u002Fc-6-0-saving-developers-from-themselves\u002F",{"title":866,"permalink":867,"heroImage":868,"timeToRead":869},"Building RSS\u002FAtom Feeds for ASP.NET MVC","\u002Fbuilding-rssatom-feeds-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FRSS-And-Atom-1366x768.png",19,{"title":871,"permalink":872,"heroImage":873,"timeToRead":819},"Canonical URL's for ASP.NET MVC","\u002Fcanonical-urls-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FLink-Juice-1366x768.png",{"title":875,"permalink":876,"heroImage":877,"timeToRead":764},"Dynamically Generating Robots.txt Using ASP.NET MVC","\u002Fdynamically-generating-robots-txt-using-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FRobots.txt-1366x768.jpg",{"title":879,"permalink":880,"heroImage":881,"timeToRead":764},"Minifying HTML for ASP.NET MVC","\u002Fminifying-html-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FThe-Internet-Is-A-Series-Of-Tubes-1366x768.jpg",{"title":883,"permalink":884,"heroImage":834,"timeToRead":614},"Whats New in ASP.NET Core Boilerplate","\u002Fwhats-new-in-asp-net-5-mvc-6-boilerplate\u002F",{"title":886,"permalink":887,"heroImage":888,"timeToRead":835},"Dynamically Generating Sitemap.xml for ASP.NET MVC","\u002Fdynamically-generating-sitemap-xml-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FSitemaps-1366x768.png",{"title":890,"permalink":891,"heroImage":892,"timeToRead":614},"So I've Been Awarded Microsoft MVP Status!","\u002Fso-ive-been-awarded-microsoft-mvp-status\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-MVP-1366x768.png",{"title":894,"permalink":895,"heroImage":896,"timeToRead":710},".NET Big-O Algorithm Complexity Cheat Sheet","\u002Fnet-big-o-algorithm-complexity-cheat-sheet\u002F","\u002Fimages\u002Fhero\u002FNET-Big-O-Algorithm-Complexity-Cheat-Sheet-1366x768.jpg",{"title":898,"permalink":899,"heroImage":900,"timeToRead":759},"Logging with Serilog.Exceptions","\u002Flogging-with-serilog-exceptions\u002F","\u002Fimages\u002Fhero\u002FSerilog.Exceptions-1366x768.png",{"title":902,"permalink":903,"heroImage":904,"timeToRead":710},"Make Certificate","\u002Fmake-certificate\u002F","\u002Fimages\u002Fhero\u002FMake-Certificate-1366x768.png",{"title":906,"permalink":907,"heroImage":908,"timeToRead":614},"Colorful.Console","\u002Fcolorful-console\u002F","\u002Fimages\u002Fhero\u002FColorful.Console-1366x768.png",{"title":910,"permalink":911,"heroImage":912,"timeToRead":759},"Subresource Integrity TagHelper Using ASP.NET Core - Part 1","\u002Fsubresource-integrity-taghelper-using-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FMake-Security-Easy-1366x768.png",{"title":914,"permalink":915,"heroImage":912,"timeToRead":764},"Subresource Integrity TagHelper Using ASP.NET Core - Part 2","\u002Fsubresource-integrity-taghelper-using-asp-net-core-part-2\u002F",{"title":917,"permalink":918,"heroImage":919,"timeToRead":804},"Social TagHelpers for ASP.NET Core","\u002Fsocial-taghelpers-for-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSocial-Media-1366x768.png",{"title":39,"permalink":738,"heroImage":736,"timeToRead":745},{"title":922,"permalink":923,"heroImage":924,"timeToRead":614},"ASP.NET Core Fluent Interface Extensions","\u002Fasp-net-core-fluent-interface-extensions\u002F","\u002Fimages\u002Fhero\u002FFluent-Interface-All-The-Things-1366x768.png",{"title":926,"permalink":927,"heroImage":928,"timeToRead":819},"NGINX for ASP.NET Core In-Depth","\u002Fnginx-asp-net-core-depth\u002F","\u002Fimages\u002Fhero\u002FNGINX-1366x768.png",{"title":930,"permalink":931,"heroImage":754,"timeToRead":614},"The Dotnet Watch Tool","\u002Fthe-dotnet-watch-tool\u002F",{"title":933,"permalink":934,"heroImage":935,"timeToRead":764},"Making Application Insights Fast & Secure","\u002Fmaking-application-insights-fast-and-secure\u002F","\u002Fimages\u002Fhero\u002FApplication-Insights-1366x768.png",{"title":937,"permalink":938,"heroImage":939,"timeToRead":835},"SEO Friendly URL's for ASP.NET Core","\u002Fseo-friendly-urls-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSearch-Engine-Optimization-SEO-1366x768.png",{"title":941,"permalink":942,"heroImage":763,"timeToRead":710},"Reactive Extensions (Rx) - Part 8 - Timeouts","\u002Freactive-extensions-rx-part-8-timeouts\u002F",{"title":944,"permalink":945,"heroImage":754,"timeToRead":764},"Custom Project Templates Using dotnet new","\u002Fcustom-project-templates-using-dotnet-new\u002F",{"title":947,"permalink":948,"heroImage":949,"timeToRead":794},"Cross-Platform DevOps for .NET Core","\u002Fcross-platform-devops-net-core\u002F","\u002Fimages\u002Fhero\u002FDotnet-Cake-AppVeyor-Travis-1366x768.png",{"title":951,"permalink":952,"heroImage":953,"timeToRead":835},"Cleaning Up CSPROJ","\u002Fcleaning-up-csproj\u002F","\u002Fimages\u002Fhero\u002FCleaning-Up-CSPROJ-1366x768.png",{"title":955,"permalink":956,"heroImage":957,"timeToRead":958},"dotnet new Feature Selection","\u002Fdotnet-new-feature-selection\u002F","\u002Fimages\u002Fhero\u002FWho-Wants-To-Be-A-Millionaire-1366x768.png",9,{"title":960,"permalink":961,"heroImage":962,"timeToRead":764},"ASP.NET Core Lazy Command Pattern","\u002Fasp-net-core-lazy-command-pattern\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Lazy-Command-Pattern-1366x768.png",{"title":964,"permalink":965,"heroImage":966,"timeToRead":614},"Structured Data using Schema.NET","\u002Fstructured-data-using-schema-net\u002F","\u002Fimages\u002Fhero\u002FSchema.NET-1366x768.png",{"title":968,"permalink":969,"heroImage":970,"timeToRead":745},"Keeping Up With Software Development","\u002Fkeeping-software-development\u002F","\u002Fimages\u002Fhero\u002FKeeping-up-with-Software-Development-1366x768.png",{"title":972,"permalink":973,"heroImage":974,"timeToRead":614},"A Very Generic .editorconfig File (Updated)","\u002Fgeneric-editorconfig-file\u002F","\u002Fimages\u002Fhero\u002FA-Very-Generic-Editorconfig-File-1366x768.png",{"title":976,"permalink":977,"heroImage":978,"timeToRead":804},"ASP.NET Core Caching in Practice","\u002Fasp-net-core-caching-in-practice\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Caching-in-Practice-1366x768.png",{"title":980,"permalink":981,"heroImage":982,"timeToRead":710},"Docker Read-Only File Systems","\u002Fdocker-read-file-systems\u002F","\u002Fimages\u002Fhero\u002FDocker-1366x768.png",{"title":984,"permalink":985,"heroImage":982,"timeToRead":759},"Docker Labels in Depth","\u002Fdocker-labels-depth\u002F",{"title":987,"permalink":988,"heroImage":982,"timeToRead":764},"Useful Docker Images - Part 1","\u002Fuseful-docker-images-part1\u002F",{"title":990,"permalink":991,"heroImage":982,"timeToRead":804},"Useful Docker Images - Part 2","\u002Fuseful-docker-images-part2\u002F",{"title":993,"permalink":994,"heroImage":995,"timeToRead":764},"Writing your Webpack configuration in TypeScript","\u002Fwriting-your-webpack-configuration-in-typescript\u002F","\u002Fimages\u002Fhero\u002FTypeScript-1366x768.png",{"title":997,"permalink":998,"heroImage":999,"timeToRead":804},"Writing Code while Asleep","\u002Fwriting-code-asleep\u002F","\u002Fimages\u002Fhero\u002FWhile-Alive-Eat-Sleep-Code-Repeat-1366x768.png",{"title":1001,"permalink":1002,"heroImage":754,"timeToRead":614},"The Dotnet Watch Tool Revisited","\u002Fthe-dotnet-watch-tool-revisited\u002F",{"title":1004,"permalink":1005,"heroImage":1006,"timeToRead":614},".NET Boxed","\u002Fnet-boxed\u002F","\u002Fimages\u002Fhero\u002FDotnet-Boxed-1366x768.png",{"title":1008,"permalink":1009,"heroImage":754,"timeToRead":614},"Migrating to Entity Framework Core Seed Data","\u002Fmigrating-to-entity-framework-core-seed-data\u002F",{"title":1011,"permalink":1012,"heroImage":754,"timeToRead":759},"Optimally Configuring Entity Framework Core","\u002Foptimally-configuring-entity-framework-core\u002F",{"title":1014,"permalink":1015,"heroImage":754,"timeToRead":710},"ASP.NET Core Hidden Gem - QueryHelpers","\u002Fasp-net-core-hidden-gem-queryhelpers\u002F",{"title":1017,"permalink":1018,"heroImage":754,"timeToRead":958},"Optimally Configuring ASP.NET Core HttpClientFactory","\u002Foptimally-configuring-asp-net-core-httpclientfactory\u002F",{"title":1020,"permalink":1021,"heroImage":1022,"timeToRead":835},"PluralSight vs LinkedIn Learning vs FrontendMasters vs Egghead.io vs YouTube","\u002Fpluralsight-vs-linkedin-learning-vs-frontendmasters-vs-egghead-io-vs-youtube\u002F","\u002Fimages\u002Fhero\u002FOnline-Learning-1366x768.png",{"title":1024,"permalink":1025,"heroImage":1026,"timeToRead":958},"Is ASP.NET Core now a Mature Platform?","\u002Fis-asp-net-core-now-a-mature-platform\u002F","\u002Fimages\u002Fhero\u002FRocket-1366x768.jpg",{"title":1028,"permalink":1029,"heroImage":1006,"timeToRead":958},"A Simple and Fast Object Mapper","\u002Fa-simple-and-fast-object-mapper\u002F",{"title":1031,"permalink":1032,"heroImage":982,"timeToRead":710},"Securing ASP.NET Core in Docker","\u002Fsecuring-asp-net-core-in-docker\u002F",{"title":1034,"permalink":1035,"heroImage":1036,"timeToRead":764},"Git Cloning the Windows OS Repo","\u002Fgit-cloning-the-windows-os-repo\u002F","\u002Fimages\u002Fhero\u002FWindows-1366x768.png",{"title":1038,"permalink":1039,"heroImage":1040,"timeToRead":835},".gitattributes Best Practices","\u002Fgitattributes-best-practices\u002F","\u002Fimages\u002Fhero\u002FGit-1366x768.png",{"title":1042,"permalink":1043,"heroImage":754,"timeToRead":759},"Unit Testing dotnet new Templates","\u002Funit-testing-dotnet-new-templates\u002F",{"title":1045,"permalink":1046,"heroImage":1006,"timeToRead":804},"What dotnet new Could Be","\u002Fwhat-dotnet-new-could-be\u002F",{"title":1048,"permalink":1049,"heroImage":754,"timeToRead":764},"ASP.NET Core Integration Testing & Mocking using Moq","\u002Fasp-net-core-integration-testing-mocking-using-moq\u002F",{"title":1051,"permalink":1052,"heroImage":1053,"timeToRead":835},"Choosing a Static Site Generator","\u002Fchoosing-a-static-site-generator\u002F","\u002Fimages\u002Fhero\u002FStatic-Site-Generators-1600x900.png",{"title":1055,"permalink":1056,"heroImage":1057,"timeToRead":614},"Spicing up your Browser Console","\u002Fspicing-up-your-browser-console\u002F","\u002Fimages\u002Fhero\u002FFiglet-Fonts-1600x900.png",{"title":1059,"permalink":1060,"heroImage":1061,"timeToRead":804},"Racism in Software Development & Beyond","\u002Fracism-in-software-development-and-beyond\u002F","\u002Fimages\u002Fhero\u002FBlack-Glowing-Fist-1600x900.png",{"title":1063,"permalink":1064,"heroImage":1065,"timeToRead":804},"The Easiest Way to Version NuGet Packages","\u002Fthe-easiest-way-to-version-nuget-packages\u002F","\u002Fimages\u002Fhero\u002FSemantic-Versioning-1600x900.png",{"title":1067,"permalink":1068,"heroImage":808,"timeToRead":745},"The Fastest NuGet Package Ever Published (Probably)","\u002Fthe-fastest-nuget-package-ever-published-probably\u002F",{"title":1070,"permalink":1071,"heroImage":754,"timeToRead":759},"Automating .NET Security Updates","\u002Fautomating-dotnet-security-updates\u002F",{"title":1073,"permalink":1074,"heroImage":1075,"timeToRead":1076},"Deep Dive into Open Telemetry for .NET","\u002Fdeep-dive-into-open-telemetry-for-net\u002F","\u002Fimages\u002Fhero\u002FOpen-Telemetry-1600x900.png",10,{"title":1078,"permalink":1079,"heroImage":1075,"timeToRead":759},"Open Telemetry for ASP.NET Core","\u002Fopen-telemetry-for-asp-net-core\u002F",{"title":1081,"permalink":1082,"heroImage":1075,"timeToRead":759},"Exporting Open Telemetry Data to Jaeger","\u002Fexporting-open-telemetry-data-to-jaeger\u002F",{"title":1084,"permalink":1085,"heroImage":1086,"timeToRead":759},"A System for Grouping & Sorting CSS Properties","\u002Fsystem-for-grouping-and-sorting-css-properties\u002F","\u002Fimages\u002Fhero\u002FCSS-1600x900.png",{"title":1088,"permalink":1089,"heroImage":1086,"timeToRead":745},"CSS General Rules of Thumb","\u002Fcss-general-rules-of-thumb\u002F",{"title":1091,"permalink":1092,"heroImage":1093,"timeToRead":764},"Web Component Custom Element Gotchas","\u002Fweb-component-custom-element-gotchas\u002F","\u002Fimages\u002Fhero\u002FWeb-Components-1600x900.png",{"title":1095,"permalink":1096,"heroImage":1097,"timeToRead":614},"Code Coverage & Frontend Testing","\u002Fcode-coverage-and-frontend-testing\u002F","\u002Fimages\u002Fhero\u002FJest-Cypress-1600x900.png",{"title":1099,"permalink":1100,"heroImage":844,"timeToRead":710},".NET Boxed Visual Studio Integration","\u002Fdotnet-boxed-visual-studio-integration\u002F",{"title":1102,"permalink":1103,"heroImage":1104,"timeToRead":759},"The Windows Package Manager","\u002Fwindows-package-manager\u002F","\u002Fimages\u002Fhero\u002FWinget-1600x900.png",{"title":1106,"permalink":1107,"heroImage":754,"timeToRead":759},"The Problem with C# 10 Implicit Usings","\u002Fthe-problem-with-csharp-10-implicit-usings\u002F",{"title":1109,"permalink":1110,"heroImage":1075,"timeToRead":764},"Optimally Configuring Open Telemetry Tracing for ASP.NET Core","\u002Foptimally-configuring-open-telemetry-tracing-for-asp-net-core\u002F",{"title":1112,"permalink":1113,"heroImage":1114,"timeToRead":614},"Live Streaming .NET","\u002Flive-streaming-dotnet\u002F","\u002Fimages\u002Fhero\u002FMy-YouTube-1920x1080.jpg",{"title":1116,"permalink":1117,"heroImage":1118,"timeToRead":614},"I Was Awarded as an Open UK Honouree","\u002Fopen-uk-honouree\u002F","\u002Fimages\u002Fhero\u002FOpen-UK-Honours-1366x768.jpg",{"title":1120,"permalink":1121,"heroImage":1122,"timeToRead":764},"On the Etiquette of Pull Request Comments","\u002Fon-the-etiquette-of-pull-request-comments\u002F","\u002Fimages\u002Fhero\u002FPrecious-PR-1600x900.jpg",{"title":1124,"permalink":1125,"heroImage":1126,"timeToRead":710},"AI Gone Rogue","\u002Fai-gone-rogue\u002F","\u002Fimages\u002Fhero\u002FHAL-9000-Prop-1600x900.png",{"title":1128,"permalink":1129,"heroImage":1130,"timeToRead":804},"AI Learnings from Upgrading My Blog","\u002Fai-learnings-from-upgrading-my-blog\u002F","\u002Fimages\u002Fhero\u002FAI-Agents-Upgrading-a-Blog-With-Human-Code-Review-1600x900.png",{"left":4,"top":4,"width":24,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":1132},"\u003Cpath fill=\"currentColor\" d=\"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.55 96.55 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.3 96.3 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96s-42.981-96-96-96\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":1134},"\u003Cpath fill=\"currentColor\" d=\"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48c27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":1136},"\u003Cpath fill=\"currentColor\" d=\"M459.37 151.716c.325 4.548.325 9.097.325 13.645c0 138.72-105.583 298.558-298.558 298.558c-59.452 0-114.68-17.219-161.137-47.106c8.447.974 16.568 1.299 25.34 1.299c49.055 0 94.213-16.568 130.274-44.832c-46.132-.975-84.792-31.188-98.112-72.772c6.498.974 12.995 1.624 19.818 1.624c9.421 0 18.843-1.3 27.614-3.573c-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319c-28.264-18.843-46.781-51.005-46.781-87.391c0-19.492 5.197-37.36 14.294-52.954c51.655 63.675 129.3 105.258 216.365 109.807c-1.624-7.797-2.599-15.918-2.599-24.04c0-57.828 46.782-104.934 104.934-104.934c30.213 0 57.502 12.67 76.67 33.137c23.715-4.548 46.456-13.32 66.599-25.34c-7.798 24.366-24.366 44.833-46.132 57.827c21.117-2.273 41.584-8.122 60.426-16.243c-14.292 20.791-32.161 39.308-52.628 54.253\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":1138},"\u003Cpath fill=\"currentColor\" d=\"M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6c0-13.8 11.1-24.9 24.9-24.9c13.6 0 24.6 11.1 24.6 24.9c0 13.6-11.1 24.6-24.6 24.6M504 256c0 137-111 248-248 248S8 393 8 256S119 8 256 8s248 111 248 248m-132.3-41.2c-9.4 0-17.7 3.9-23.8 10c-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3l55.4 12.5c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8c-6.1-6.4-14.7-10.2-24.1-10.2c-34.9 0-46.3 46.9-14.4 62.8c-1.1 5-1.7 10.2-1.7 15.5c0 52.6 59.2 95.2 132 95.2c73.1 0 132.3-42.6 132.3-95.2c0-5.3-.6-10.8-1.9-15.8c31.3-16 19.8-62.5-14.9-62.5M302.8 331c-18.2 18.2-76.1 17.9-93.6 0c-2.2-2.2-6.1-2.2-8.3 0c-2.5 2.5-2.5 6.4 0 8.6c22.8 22.8 87.3 22.8 110.2 0c2.5-2.2 2.5-6.1 0-8.6c-2.2-2.2-6.1-2.2-8.3 0m7.7-75c-13.6 0-24.6 11.1-24.6 24.9c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.1 24.9-24.6c0-13.8-11-24.9-24.9-24.9\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":1140},"\u003Cpath fill=\"currentColor\" d=\"M512 194.8c0 101.3-82.4 183.8-183.8 183.8c-101.7 0-184.4-82.4-184.4-183.8c0-101.6 82.7-184.3 184.4-184.3C429.6 10.5 512 93.2 512 194.8M0 501.5h90v-491H0z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1142},"\u003Cpath fill=\"currentColor\" d=\"m20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379c-.197-.069-.42-.098-.57-.241c-.152-.143-.196-.366-.231-.572c-.065-.378-.125-.756-.192-1.133c-.057-.325-.102-.69-.25-.987c-.195-.4-.597-.634-.996-.788a6 6 0 0 0-.626-.194c-1-.263-2.05-.36-3.077-.416a26 26 0 0 0-3.7.062c-.915.083-1.88.184-2.75.5c-.318.116-.646.256-.888.501c-.297.302-.393.77-.177 1.146c.154.267.415.456.692.58c.36.162.737.284 1.123.366c1.075.238 2.189.331 3.287.37q1.829.074 3.65-.118q.449-.05.896-.119c.352-.054.578-.513.474-.834c-.124-.383-.457-.531-.834-.473c-.466.074-.96.108-1.382.146q-1.767.12-3.536.006a22 22 0 0 1-1.157-.107c-.086-.01-.18-.025-.258-.036q-.364-.055-.724-.13c-.111-.027-.111-.185 0-.212h.005q.416-.09.838-.147h.002c.131-.009.263-.032.394-.048a25 25 0 0 1 3.426-.12q1.011.029 2.017.144l.228.031q.4.06.798.145c.392.085.895.113 1.07.542c.055.137.08.288.111.431l.319 1.484a.237.237 0 0 1-.199.284h-.003l-.112.015a37 37 0 0 1-4.743.295a37 37 0 0 1-4.699-.304c-.14-.017-.293-.042-.417-.06c-.326-.048-.649-.108-.973-.161c-.393-.065-.768-.032-1.123.161c-.29.16-.527.404-.675.701c-.154.316-.199.66-.267 1c-.069.34-.176.707-.135 1.056c.087.753.613 1.365 1.37 1.502a39.7 39.7 0 0 0 11.343.376a.483.483 0 0 1 .535.53l-.071.697l-1.018 9.907c-.041.41-.047.832-.125 1.237c-.122.637-.553 1.028-1.182 1.171q-.868.197-1.756.205c-.656.004-1.31-.025-1.966-.022c-.699.004-1.556-.06-2.095-.58c-.475-.458-.54-1.174-.605-1.793l-.731-7.013l-.322-3.094c-.037-.351-.286-.695-.678-.678c-.336.015-.718.3-.678.679l.228 2.185l.949 9.112c.147 1.344 1.174 2.068 2.446 2.272c.742.12 1.503.144 2.257.156c.966.016 1.942.053 2.892-.122c1.408-.258 2.465-1.198 2.616-2.657l1.024-9.995l.215-2.087a.48.48 0 0 1 .39-.426c.402-.078.787-.212 1.074-.518c.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233c-2.416.359-4.866.54-7.308.46c-1.748-.06-3.477-.254-5.207-.498c-.17-.024-.353-.055-.47-.18c-.22-.236-.111-.71-.054-.995c.052-.26.152-.609.463-.646c.484-.057 1.046.148 1.526.22q.865.132 1.737.212c2.48.226 5.002.19 7.472-.14q.675-.09 1.345-.21c.399-.072.84-.206 1.08.206c.166.281.188.657.162.974a.54.54 0 0 1-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a6 6 0 0 1-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38c0 0 1.243.065 1.658.065c.447 0 1.786-.065 1.786-.065c.783 0 1.434-.6 1.499-1.38l.94-9.95a4 4 0 0 0-1.322-.238c-.826 0-1.491.284-2.26.613\"\u002F>",{"left":4,"top":4,"width":27,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":1144},"\u003Cpath fill=\"currentColor\" d=\"M111.4 295.9c-3.5 19.2-17.4 108.7-21.5 134c-.3 1.8-1 2.5-3 2.5H12.3c-7.6 0-13.1-6.6-12.1-13.9L58.8 46.6c1.5-9.6 10.1-16.9 20-16.9c152.3 0 165.1-3.7 204 11.4c60.1 23.3 65.6 79.5 44 140.3c-21.5 62.6-72.5 89.5-140.1 90.3c-43.4.7-69.5-7-75.3 24.2M357.1 152c-1.8-1.3-2.5-1.8-3 1.3c-2 11.4-5.1 22.5-8.8 33.6c-39.9 113.8-150.5 103.9-204.5 103.9c-6.1 0-10.1 3.3-10.9 9.4c-22.6 140.4-27.1 169.7-27.1 169.7c-1 7.1 3.5 12.9 10.6 12.9h63.5c8.6 0 15.7-6.3 17.4-14.9c.7-5.4-1.1 6.1 14.4-91.3c4.6-22 14.3-19.7 29.3-19.7c71 0 126.4-28.8 142.9-112.3c6.5-34.8 4.6-71.4-23.8-92.6\"\u002F>",{"left":4,"top":4,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":1146},"\u003Cpath fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8m0 448c-110.532 0-200-89.431-200-200c0-110.495 89.472-200 200-200c110.491 0 200 89.471 200 200c0 110.53-89.431 200-200 200m107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516c17.561-9.845 28.324-16.541 28.324-29.579c0-17.246-21.999-28.693-39.784-28.693c-23.189 0-33.894 10.977-48.942 29.969c-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8M298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42s18.841-42 42-42s42 18.841 42 42\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1148},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 12H5m7 7l-7-7l7-7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1150},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1794051072045]