Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SampleMsalAuthorizationCodeFlow

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Auth Scenario

  • Client: React SPA with Typescript, leveraging MSAL.JS 2.0
  • API: ASP.NET Core Web API 3.x
  • Azure AD: Single app registration with RBAC roles

Tutorial Post

For an end-to-end walkthrough and frequently asked questions, visit the linked blog post: https://keithbabinec.com/2020/09/27/oauth-2-0-authorization-code-flow-with-a-react-spa-asp-net-core-web-api-rbac-roles-and-msal

Azure AD configuration

These steps are required before you can build and run the application. All steps are to be executed from a PowerShell prompt.

  1. Install Azure CLI tooling: install-azure-prerequisites.ps1

    install-azure-prerequisites.ps1
  2. Configure application RBAC groups: new-rbac-groups.ps1

    new-rbac-groups.ps1 -RbacGroupNames 'MyAppUsersGroup','MyAppAdministratorsGroup'
  3. Create Azure AD app registration: new-app-registration.ps1

    new-app-registration.ps1 -AppRegistrationName 'authorization-flow-test-app'-RbacRoleNames 'MyAppUsersRole','MyAppAdministratorsRole'
  4. Create Azure AD app service principal: new-app-serviceprincipal.ps1

    new-app-serviceprincipal.ps1 -AppRegistrationName 'authorization-flow-test-app'

The following additional manual steps are required because no reasonable Azure tooling operation exists (yet) or they require more environment specific information.

  1. In Azure AD Groups, add at least one user to each of the role groups created in step 2.

  2. In the Azure AD app registration, click on the Authentication page then add your redirect URI's.

    • These must be of type 'SPA' and not 'Web', otherwise the auth flow will fail.
    • At minimum, add your local debug URI: https://localhost:3000 -- but you can also add your production environment redirects here if you know what they will be.
  3. In the Azure AD app registration, click on the Expose an API page then take note of scope defined by the API.

    • There should be a default 'user_impersonation' scope created if you ran the script from step 4.
    • Copy the scope URI because it will be used in the MSAL app config later.
  4. In the Azure AD app service principal (enterprise application), click on the Properties page, then set the User Assignment Required field to Yes.

    • This must be set to enforce authorized access to your client app.
  5. In the Azure AD app service principal (enterprise application), click on the Users and Groups page, then assign users or groups to the custom app roles you have defined.

Build and Run: Web API

  1. Restore nuget packages.

  2. Update appsettings.json and appsettings.Development.json with the Azure AD app registration details from the above setup.

  3. Launch the project, take note of the locally hosted URI.

  4. Test that the endpoints are available.

    • Open a PowerShell prompt and send a test request against each of the 3 endpoints in the sample project.
    • Replace the URI below with the specific port from your machine. The following shows the responses you should expect to see without specifying auth headers:
    Invoke-RestMethod-Uri https://localhost:44313/api/test/noauth -Method Get
    # should return: Successfully called the api/test/noauth endpoint, as an unauthenticated/anonymous user.Invoke-RestMethod-Uri https://localhost:44313/api/test/standard -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).Invoke-RestMethod-Uri https://localhost:44313/api/test/admin -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).

Build and Run: Web Client

  1. Restore NPM packages

    npm install
    
  2. Update .env.development and .env.production with the Azure AD app registration details from the above setup.

  3. Start the project with local debugging.

    npm start
    
  4. When the application starts in the browser:

    • Click the 'login' button, which will redirect you to the Microsoft Identity platform to sign in.
    • Sign in with a user that has been assigned to one of your app roles.
    • Upon redirect you should see buttons to invoke the 3 test web api endpoints.
    • Invoke the test endpoints to validate the end-to-end flow.

Screenshots

auth-code-flow-1

auth-code-flow-2

auth-code-flow-3

auth-code-flow-4

auth-code-flow-5

About

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Topics

Resources

Stars

18 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SampleMsalAuthorizationCodeFlow

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Auth Scenario

  • Client: React SPA with Typescript, leveraging MSAL.JS 2.0
  • API: ASP.NET Core Web API 3.x
  • Azure AD: Single app registration with RBAC roles

Tutorial Post

For an end-to-end walkthrough and frequently asked questions, visit the linked blog post: https://keithbabinec.com/2020/09/27/oauth-2-0-authorization-code-flow-with-a-react-spa-asp-net-core-web-api-rbac-roles-and-msal

Azure AD configuration

These steps are required before you can build and run the application. All steps are to be executed from a PowerShell prompt.

  1. Install Azure CLI tooling: install-azure-prerequisites.ps1

    install-azure-prerequisites.ps1
  2. Configure application RBAC groups: new-rbac-groups.ps1

    new-rbac-groups.ps1 -RbacGroupNames 'MyAppUsersGroup','MyAppAdministratorsGroup'
  3. Create Azure AD app registration: new-app-registration.ps1

    new-app-registration.ps1 -AppRegistrationName 'authorization-flow-test-app'-RbacRoleNames 'MyAppUsersRole','MyAppAdministratorsRole'
  4. Create Azure AD app service principal: new-app-serviceprincipal.ps1

    new-app-serviceprincipal.ps1 -AppRegistrationName 'authorization-flow-test-app'

The following additional manual steps are required because no reasonable Azure tooling operation exists (yet) or they require more environment specific information.

  1. In Azure AD Groups, add at least one user to each of the role groups created in step 2.

  2. In the Azure AD app registration, click on the Authentication page then add your redirect URI's.

    • These must be of type 'SPA' and not 'Web', otherwise the auth flow will fail.
    • At minimum, add your local debug URI: https://localhost:3000 -- but you can also add your production environment redirects here if you know what they will be.
  3. In the Azure AD app registration, click on the Expose an API page then take note of scope defined by the API.

    • There should be a default 'user_impersonation' scope created if you ran the script from step 4.
    • Copy the scope URI because it will be used in the MSAL app config later.
  4. In the Azure AD app service principal (enterprise application), click on the Properties page, then set the User Assignment Required field to Yes.

    • This must be set to enforce authorized access to your client app.
  5. In the Azure AD app service principal (enterprise application), click on the Users and Groups page, then assign users or groups to the custom app roles you have defined.

Build and Run: Web API

  1. Restore nuget packages.

  2. Update appsettings.json and appsettings.Development.json with the Azure AD app registration details from the above setup.

  3. Launch the project, take note of the locally hosted URI.

  4. Test that the endpoints are available.

    • Open a PowerShell prompt and send a test request against each of the 3 endpoints in the sample project.
    • Replace the URI below with the specific port from your machine. The following shows the responses you should expect to see without specifying auth headers:
    Invoke-RestMethod-Uri https://localhost:44313/api/test/noauth -Method Get
    # should return: Successfully called the api/test/noauth endpoint, as an unauthenticated/anonymous user.Invoke-RestMethod-Uri https://localhost:44313/api/test/standard -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).Invoke-RestMethod-Uri https://localhost:44313/api/test/admin -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).

Build and Run: Web Client

  1. Restore NPM packages

    npm install
    
  2. Update .env.development and .env.production with the Azure AD app registration details from the above setup.

  3. Start the project with local debugging.

    npm start
    
  4. When the application starts in the browser:

    • Click the 'login' button, which will redirect you to the Microsoft Identity platform to sign in.
    • Sign in with a user that has been assigned to one of your app roles.
    • Upon redirect you should see buttons to invoke the 3 test web api endpoints.
    • Invoke the test endpoints to validate the end-to-end flow.

Screenshots

auth-code-flow-1

auth-code-flow-2

auth-code-flow-3

auth-code-flow-4

auth-code-flow-5

About

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Topics

Resources

Stars

18 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SampleMsalAuthorizationCodeFlow

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Auth Scenario

  • Client: React SPA with Typescript, leveraging MSAL.JS 2.0
  • API: ASP.NET Core Web API 3.x
  • Azure AD: Single app registration with RBAC roles

Tutorial Post

For an end-to-end walkthrough and frequently asked questions, visit the linked blog post: https://keithbabinec.com/2020/09/27/oauth-2-0-authorization-code-flow-with-a-react-spa-asp-net-core-web-api-rbac-roles-and-msal

Azure AD configuration

These steps are required before you can build and run the application. All steps are to be executed from a PowerShell prompt.

  1. Install Azure CLI tooling: install-azure-prerequisites.ps1

    install-azure-prerequisites.ps1
  2. Configure application RBAC groups: new-rbac-groups.ps1

    new-rbac-groups.ps1 -RbacGroupNames 'MyAppUsersGroup','MyAppAdministratorsGroup'
  3. Create Azure AD app registration: new-app-registration.ps1

    new-app-registration.ps1 -AppRegistrationName 'authorization-flow-test-app'-RbacRoleNames 'MyAppUsersRole','MyAppAdministratorsRole'
  4. Create Azure AD app service principal: new-app-serviceprincipal.ps1

    new-app-serviceprincipal.ps1 -AppRegistrationName 'authorization-flow-test-app'

The following additional manual steps are required because no reasonable Azure tooling operation exists (yet) or they require more environment specific information.

  1. In Azure AD Groups, add at least one user to each of the role groups created in step 2.

  2. In the Azure AD app registration, click on the Authentication page then add your redirect URI's.

    • These must be of type 'SPA' and not 'Web', otherwise the auth flow will fail.
    • At minimum, add your local debug URI: https://localhost:3000 -- but you can also add your production environment redirects here if you know what they will be.
  3. In the Azure AD app registration, click on the Expose an API page then take note of scope defined by the API.

    • There should be a default 'user_impersonation' scope created if you ran the script from step 4.
    • Copy the scope URI because it will be used in the MSAL app config later.
  4. In the Azure AD app service principal (enterprise application), click on the Properties page, then set the User Assignment Required field to Yes.

    • This must be set to enforce authorized access to your client app.
  5. In the Azure AD app service principal (enterprise application), click on the Users and Groups page, then assign users or groups to the custom app roles you have defined.

Build and Run: Web API

  1. Restore nuget packages.

  2. Update appsettings.json and appsettings.Development.json with the Azure AD app registration details from the above setup.

  3. Launch the project, take note of the locally hosted URI.

  4. Test that the endpoints are available.

    • Open a PowerShell prompt and send a test request against each of the 3 endpoints in the sample project.
    • Replace the URI below with the specific port from your machine. The following shows the responses you should expect to see without specifying auth headers:
    Invoke-RestMethod-Uri https://localhost:44313/api/test/noauth -Method Get
    # should return: Successfully called the api/test/noauth endpoint, as an unauthenticated/anonymous user.Invoke-RestMethod-Uri https://localhost:44313/api/test/standard -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).Invoke-RestMethod-Uri https://localhost:44313/api/test/admin -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).

Build and Run: Web Client

  1. Restore NPM packages

    npm install
    
  2. Update .env.development and .env.production with the Azure AD app registration details from the above setup.

  3. Start the project with local debugging.

    npm start
    
  4. When the application starts in the browser:

    • Click the 'login' button, which will redirect you to the Microsoft Identity platform to sign in.
    • Sign in with a user that has been assigned to one of your app roles.
    • Upon redirect you should see buttons to invoke the 3 test web api endpoints.
    • Invoke the test endpoints to validate the end-to-end flow.

Screenshots

auth-code-flow-1

auth-code-flow-2

auth-code-flow-3

auth-code-flow-4

auth-code-flow-5

About

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Topics

Resources

Stars

18 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SampleMsalAuthorizationCodeFlow

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Auth Scenario

  • Client: React SPA with Typescript, leveraging MSAL.JS 2.0
  • API: ASP.NET Core Web API 3.x
  • Azure AD: Single app registration with RBAC roles

Tutorial Post

For an end-to-end walkthrough and frequently asked questions, visit the linked blog post: https://keithbabinec.com/2020/09/27/oauth-2-0-authorization-code-flow-with-a-react-spa-asp-net-core-web-api-rbac-roles-and-msal

Azure AD configuration

These steps are required before you can build and run the application. All steps are to be executed from a PowerShell prompt.

  1. Install Azure CLI tooling: install-azure-prerequisites.ps1

    install-azure-prerequisites.ps1
  2. Configure application RBAC groups: new-rbac-groups.ps1

    new-rbac-groups.ps1 -RbacGroupNames 'MyAppUsersGroup','MyAppAdministratorsGroup'
  3. Create Azure AD app registration: new-app-registration.ps1

    new-app-registration.ps1 -AppRegistrationName 'authorization-flow-test-app'-RbacRoleNames 'MyAppUsersRole','MyAppAdministratorsRole'
  4. Create Azure AD app service principal: new-app-serviceprincipal.ps1

    new-app-serviceprincipal.ps1 -AppRegistrationName 'authorization-flow-test-app'

The following additional manual steps are required because no reasonable Azure tooling operation exists (yet) or they require more environment specific information.

  1. In Azure AD Groups, add at least one user to each of the role groups created in step 2.

  2. In the Azure AD app registration, click on the Authentication page then add your redirect URI's.

    • These must be of type 'SPA' and not 'Web', otherwise the auth flow will fail.
    • At minimum, add your local debug URI: https://localhost:3000 -- but you can also add your production environment redirects here if you know what they will be.
  3. In the Azure AD app registration, click on the Expose an API page then take note of scope defined by the API.

    • There should be a default 'user_impersonation' scope created if you ran the script from step 4.
    • Copy the scope URI because it will be used in the MSAL app config later.
  4. In the Azure AD app service principal (enterprise application), click on the Properties page, then set the User Assignment Required field to Yes.

    • This must be set to enforce authorized access to your client app.
  5. In the Azure AD app service principal (enterprise application), click on the Users and Groups page, then assign users or groups to the custom app roles you have defined.

Build and Run: Web API

  1. Restore nuget packages.

  2. Update appsettings.json and appsettings.Development.json with the Azure AD app registration details from the above setup.

  3. Launch the project, take note of the locally hosted URI.

  4. Test that the endpoints are available.

    • Open a PowerShell prompt and send a test request against each of the 3 endpoints in the sample project.
    • Replace the URI below with the specific port from your machine. The following shows the responses you should expect to see without specifying auth headers:
    Invoke-RestMethod-Uri https://localhost:44313/api/test/noauth -Method Get
    # should return: Successfully called the api/test/noauth endpoint, as an unauthenticated/anonymous user.Invoke-RestMethod-Uri https://localhost:44313/api/test/standard -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).Invoke-RestMethod-Uri https://localhost:44313/api/test/admin -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).

Build and Run: Web Client

  1. Restore NPM packages

    npm install
    
  2. Update .env.development and .env.production with the Azure AD app registration details from the above setup.

  3. Start the project with local debugging.

    npm start
    
  4. When the application starts in the browser:

    • Click the 'login' button, which will redirect you to the Microsoft Identity platform to sign in.
    • Sign in with a user that has been assigned to one of your app roles.
    • Upon redirect you should see buttons to invoke the 3 test web api endpoints.
    • Invoke the test endpoints to validate the end-to-end flow.

Screenshots

auth-code-flow-1

auth-code-flow-2

auth-code-flow-3

auth-code-flow-4

auth-code-flow-5

About

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Topics

Resources

Stars

18 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SampleMsalAuthorizationCodeFlow

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Auth Scenario

  • Client: React SPA with Typescript, leveraging MSAL.JS 2.0
  • API: ASP.NET Core Web API 3.x
  • Azure AD: Single app registration with RBAC roles

Tutorial Post

For an end-to-end walkthrough and frequently asked questions, visit the linked blog post: https://keithbabinec.com/2020/09/27/oauth-2-0-authorization-code-flow-with-a-react-spa-asp-net-core-web-api-rbac-roles-and-msal

Azure AD configuration

These steps are required before you can build and run the application. All steps are to be executed from a PowerShell prompt.

  1. Install Azure CLI tooling: install-azure-prerequisites.ps1

    install-azure-prerequisites.ps1
  2. Configure application RBAC groups: new-rbac-groups.ps1

    new-rbac-groups.ps1 -RbacGroupNames 'MyAppUsersGroup','MyAppAdministratorsGroup'
  3. Create Azure AD app registration: new-app-registration.ps1

    new-app-registration.ps1 -AppRegistrationName 'authorization-flow-test-app'-RbacRoleNames 'MyAppUsersRole','MyAppAdministratorsRole'
  4. Create Azure AD app service principal: new-app-serviceprincipal.ps1

    new-app-serviceprincipal.ps1 -AppRegistrationName 'authorization-flow-test-app'

The following additional manual steps are required because no reasonable Azure tooling operation exists (yet) or they require more environment specific information.

  1. In Azure AD Groups, add at least one user to each of the role groups created in step 2.

  2. In the Azure AD app registration, click on the Authentication page then add your redirect URI's.

    • These must be of type 'SPA' and not 'Web', otherwise the auth flow will fail.
    • At minimum, add your local debug URI: https://localhost:3000 -- but you can also add your production environment redirects here if you know what they will be.
  3. In the Azure AD app registration, click on the Expose an API page then take note of scope defined by the API.

    • There should be a default 'user_impersonation' scope created if you ran the script from step 4.
    • Copy the scope URI because it will be used in the MSAL app config later.
  4. In the Azure AD app service principal (enterprise application), click on the Properties page, then set the User Assignment Required field to Yes.

    • This must be set to enforce authorized access to your client app.
  5. In the Azure AD app service principal (enterprise application), click on the Users and Groups page, then assign users or groups to the custom app roles you have defined.

Build and Run: Web API

  1. Restore nuget packages.

  2. Update appsettings.json and appsettings.Development.json with the Azure AD app registration details from the above setup.

  3. Launch the project, take note of the locally hosted URI.

  4. Test that the endpoints are available.

    • Open a PowerShell prompt and send a test request against each of the 3 endpoints in the sample project.
    • Replace the URI below with the specific port from your machine. The following shows the responses you should expect to see without specifying auth headers:
    Invoke-RestMethod-Uri https://localhost:44313/api/test/noauth -Method Get
    # should return: Successfully called the api/test/noauth endpoint, as an unauthenticated/anonymous user.Invoke-RestMethod-Uri https://localhost:44313/api/test/standard -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).Invoke-RestMethod-Uri https://localhost:44313/api/test/admin -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).

Build and Run: Web Client

  1. Restore NPM packages

    npm install
    
  2. Update .env.development and .env.production with the Azure AD app registration details from the above setup.

  3. Start the project with local debugging.

    npm start
    
  4. When the application starts in the browser:

    • Click the 'login' button, which will redirect you to the Microsoft Identity platform to sign in.
    • Sign in with a user that has been assigned to one of your app roles.
    • Upon redirect you should see buttons to invoke the 3 test web api endpoints.
    • Invoke the test endpoints to validate the end-to-end flow.

Screenshots

auth-code-flow-1

auth-code-flow-2

auth-code-flow-3

auth-code-flow-4

auth-code-flow-5

About

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Topics

Resources

Stars

18 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SampleMsalAuthorizationCodeFlow

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Auth Scenario

  • Client: React SPA with Typescript, leveraging MSAL.JS 2.0
  • API: ASP.NET Core Web API 3.x
  • Azure AD: Single app registration with RBAC roles

Tutorial Post

For an end-to-end walkthrough and frequently asked questions, visit the linked blog post: https://keithbabinec.com/2020/09/27/oauth-2-0-authorization-code-flow-with-a-react-spa-asp-net-core-web-api-rbac-roles-and-msal

Azure AD configuration

These steps are required before you can build and run the application. All steps are to be executed from a PowerShell prompt.

  1. Install Azure CLI tooling: install-azure-prerequisites.ps1

    install-azure-prerequisites.ps1
  2. Configure application RBAC groups: new-rbac-groups.ps1

    new-rbac-groups.ps1 -RbacGroupNames 'MyAppUsersGroup','MyAppAdministratorsGroup'
  3. Create Azure AD app registration: new-app-registration.ps1

    new-app-registration.ps1 -AppRegistrationName 'authorization-flow-test-app'-RbacRoleNames 'MyAppUsersRole','MyAppAdministratorsRole'
  4. Create Azure AD app service principal: new-app-serviceprincipal.ps1

    new-app-serviceprincipal.ps1 -AppRegistrationName 'authorization-flow-test-app'

The following additional manual steps are required because no reasonable Azure tooling operation exists (yet) or they require more environment specific information.

  1. In Azure AD Groups, add at least one user to each of the role groups created in step 2.

  2. In the Azure AD app registration, click on the Authentication page then add your redirect URI's.

    • These must be of type 'SPA' and not 'Web', otherwise the auth flow will fail.
    • At minimum, add your local debug URI: https://localhost:3000 -- but you can also add your production environment redirects here if you know what they will be.
  3. In the Azure AD app registration, click on the Expose an API page then take note of scope defined by the API.

    • There should be a default 'user_impersonation' scope created if you ran the script from step 4.
    • Copy the scope URI because it will be used in the MSAL app config later.
  4. In the Azure AD app service principal (enterprise application), click on the Properties page, then set the User Assignment Required field to Yes.

    • This must be set to enforce authorized access to your client app.
  5. In the Azure AD app service principal (enterprise application), click on the Users and Groups page, then assign users or groups to the custom app roles you have defined.

Build and Run: Web API

  1. Restore nuget packages.

  2. Update appsettings.json and appsettings.Development.json with the Azure AD app registration details from the above setup.

  3. Launch the project, take note of the locally hosted URI.

  4. Test that the endpoints are available.

    • Open a PowerShell prompt and send a test request against each of the 3 endpoints in the sample project.
    • Replace the URI below with the specific port from your machine. The following shows the responses you should expect to see without specifying auth headers:
    Invoke-RestMethod-Uri https://localhost:44313/api/test/noauth -Method Get
    # should return: Successfully called the api/test/noauth endpoint, as an unauthenticated/anonymous user.Invoke-RestMethod-Uri https://localhost:44313/api/test/standard -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).Invoke-RestMethod-Uri https://localhost:44313/api/test/admin -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).

Build and Run: Web Client

  1. Restore NPM packages

    npm install
    
  2. Update .env.development and .env.production with the Azure AD app registration details from the above setup.

  3. Start the project with local debugging.

    npm start
    
  4. When the application starts in the browser:

    • Click the 'login' button, which will redirect you to the Microsoft Identity platform to sign in.
    • Sign in with a user that has been assigned to one of your app roles.
    • Upon redirect you should see buttons to invoke the 3 test web api endpoints.
    • Invoke the test endpoints to validate the end-to-end flow.

Screenshots

auth-code-flow-1

auth-code-flow-2

auth-code-flow-3

auth-code-flow-4

auth-code-flow-5

About

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Topics

Resources

Stars

18 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SampleMsalAuthorizationCodeFlow

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Auth Scenario

  • Client: React SPA with Typescript, leveraging MSAL.JS 2.0
  • API: ASP.NET Core Web API 3.x
  • Azure AD: Single app registration with RBAC roles

Tutorial Post

For an end-to-end walkthrough and frequently asked questions, visit the linked blog post: https://keithbabinec.com/2020/09/27/oauth-2-0-authorization-code-flow-with-a-react-spa-asp-net-core-web-api-rbac-roles-and-msal

Azure AD configuration

These steps are required before you can build and run the application. All steps are to be executed from a PowerShell prompt.

  1. Install Azure CLI tooling: install-azure-prerequisites.ps1

    install-azure-prerequisites.ps1
  2. Configure application RBAC groups: new-rbac-groups.ps1

    new-rbac-groups.ps1 -RbacGroupNames 'MyAppUsersGroup','MyAppAdministratorsGroup'
  3. Create Azure AD app registration: new-app-registration.ps1

    new-app-registration.ps1 -AppRegistrationName 'authorization-flow-test-app'-RbacRoleNames 'MyAppUsersRole','MyAppAdministratorsRole'
  4. Create Azure AD app service principal: new-app-serviceprincipal.ps1

    new-app-serviceprincipal.ps1 -AppRegistrationName 'authorization-flow-test-app'

The following additional manual steps are required because no reasonable Azure tooling operation exists (yet) or they require more environment specific information.

  1. In Azure AD Groups, add at least one user to each of the role groups created in step 2.

  2. In the Azure AD app registration, click on the Authentication page then add your redirect URI's.

    • These must be of type 'SPA' and not 'Web', otherwise the auth flow will fail.
    • At minimum, add your local debug URI: https://localhost:3000 -- but you can also add your production environment redirects here if you know what they will be.
  3. In the Azure AD app registration, click on the Expose an API page then take note of scope defined by the API.

    • There should be a default 'user_impersonation' scope created if you ran the script from step 4.
    • Copy the scope URI because it will be used in the MSAL app config later.
  4. In the Azure AD app service principal (enterprise application), click on the Properties page, then set the User Assignment Required field to Yes.

    • This must be set to enforce authorized access to your client app.
  5. In the Azure AD app service principal (enterprise application), click on the Users and Groups page, then assign users or groups to the custom app roles you have defined.

Build and Run: Web API

  1. Restore nuget packages.

  2. Update appsettings.json and appsettings.Development.json with the Azure AD app registration details from the above setup.

  3. Launch the project, take note of the locally hosted URI.

  4. Test that the endpoints are available.

    • Open a PowerShell prompt and send a test request against each of the 3 endpoints in the sample project.
    • Replace the URI below with the specific port from your machine. The following shows the responses you should expect to see without specifying auth headers:
    Invoke-RestMethod-Uri https://localhost:44313/api/test/noauth -Method Get
    # should return: Successfully called the api/test/noauth endpoint, as an unauthenticated/anonymous user.Invoke-RestMethod-Uri https://localhost:44313/api/test/standard -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).Invoke-RestMethod-Uri https://localhost:44313/api/test/admin -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).

Build and Run: Web Client

  1. Restore NPM packages

    npm install
    
  2. Update .env.development and .env.production with the Azure AD app registration details from the above setup.

  3. Start the project with local debugging.

    npm start
    
  4. When the application starts in the browser:

    • Click the 'login' button, which will redirect you to the Microsoft Identity platform to sign in.
    • Sign in with a user that has been assigned to one of your app roles.
    • Upon redirect you should see buttons to invoke the 3 test web api endpoints.
    • Invoke the test endpoints to validate the end-to-end flow.

Screenshots

auth-code-flow-1

auth-code-flow-2

auth-code-flow-3

auth-code-flow-4

auth-code-flow-5

About

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Topics

Resources

Stars

18 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SampleMsalAuthorizationCodeFlow

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Auth Scenario

  • Client: React SPA with Typescript, leveraging MSAL.JS 2.0
  • API: ASP.NET Core Web API 3.x
  • Azure AD: Single app registration with RBAC roles

Tutorial Post

For an end-to-end walkthrough and frequently asked questions, visit the linked blog post: https://keithbabinec.com/2020/09/27/oauth-2-0-authorization-code-flow-with-a-react-spa-asp-net-core-web-api-rbac-roles-and-msal

Azure AD configuration

These steps are required before you can build and run the application. All steps are to be executed from a PowerShell prompt.

  1. Install Azure CLI tooling: install-azure-prerequisites.ps1

    install-azure-prerequisites.ps1
  2. Configure application RBAC groups: new-rbac-groups.ps1

    new-rbac-groups.ps1 -RbacGroupNames 'MyAppUsersGroup','MyAppAdministratorsGroup'
  3. Create Azure AD app registration: new-app-registration.ps1

    new-app-registration.ps1 -AppRegistrationName 'authorization-flow-test-app'-RbacRoleNames 'MyAppUsersRole','MyAppAdministratorsRole'
  4. Create Azure AD app service principal: new-app-serviceprincipal.ps1

    new-app-serviceprincipal.ps1 -AppRegistrationName 'authorization-flow-test-app'

The following additional manual steps are required because no reasonable Azure tooling operation exists (yet) or they require more environment specific information.

  1. In Azure AD Groups, add at least one user to each of the role groups created in step 2.

  2. In the Azure AD app registration, click on the Authentication page then add your redirect URI's.

    • These must be of type 'SPA' and not 'Web', otherwise the auth flow will fail.
    • At minimum, add your local debug URI: https://localhost:3000 -- but you can also add your production environment redirects here if you know what they will be.
  3. In the Azure AD app registration, click on the Expose an API page then take note of scope defined by the API.

    • There should be a default 'user_impersonation' scope created if you ran the script from step 4.
    • Copy the scope URI because it will be used in the MSAL app config later.
  4. In the Azure AD app service principal (enterprise application), click on the Properties page, then set the User Assignment Required field to Yes.

    • This must be set to enforce authorized access to your client app.
  5. In the Azure AD app service principal (enterprise application), click on the Users and Groups page, then assign users or groups to the custom app roles you have defined.

Build and Run: Web API

  1. Restore nuget packages.

  2. Update appsettings.json and appsettings.Development.json with the Azure AD app registration details from the above setup.

  3. Launch the project, take note of the locally hosted URI.

  4. Test that the endpoints are available.

    • Open a PowerShell prompt and send a test request against each of the 3 endpoints in the sample project.
    • Replace the URI below with the specific port from your machine. The following shows the responses you should expect to see without specifying auth headers:
    Invoke-RestMethod-Uri https://localhost:44313/api/test/noauth -Method Get
    # should return: Successfully called the api/test/noauth endpoint, as an unauthenticated/anonymous user.Invoke-RestMethod-Uri https://localhost:44313/api/test/standard -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).Invoke-RestMethod-Uri https://localhost:44313/api/test/admin -Method Get
    # should return: Invoke-RestMethod: Response status code does not indicate success: 401 (Unauthorized).

Build and Run: Web Client

  1. Restore NPM packages

    npm install
    
  2. Update .env.development and .env.production with the Azure AD app registration details from the above setup.

  3. Start the project with local debugging.

    npm start
    
  4. When the application starts in the browser:

    • Click the 'login' button, which will redirect you to the Microsoft Identity platform to sign in.
    • Sign in with a user that has been assigned to one of your app roles.
    • Upon redirect you should see buttons to invoke the 3 test web api endpoints.
    • Invoke the test endpoints to validate the end-to-end flow.

Screenshots

auth-code-flow-1

auth-code-flow-2

auth-code-flow-3

auth-code-flow-4

auth-code-flow-5

About

An example project to demonstrate the OAuth 2.0 authorization code flow against a protected web api resource with RBAC roles.

Topics

Resources

Stars

18 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages