├── .editorconfig ├── .github └── FUNDING.yml ├── .gitignore ├── .vs └── config │ └── applicationhost.config ├── .vscode ├── IdentityAzureTable-Main.code-workspace ├── IdentityAzureTable-Samples.code-workspace ├── launch.json ├── settings.json └── tasks.json ├── 3rdParty ├── 7-Zip │ ├── 7-zip.chm │ ├── 7-zip.dll │ ├── 7z.dll │ ├── 7z.exe │ ├── 7z.sfx │ ├── 7zCon.sfx │ ├── 7zFM.exe │ ├── 7zG.exe │ ├── History.txt │ ├── Lang │ │ ├── af.txt │ │ ├── ar.txt │ │ ├── ast.txt │ │ ├── az.txt │ │ ├── ba.txt │ │ ├── be.txt │ │ ├── bg.txt │ │ ├── bn.txt │ │ ├── br.txt │ │ ├── ca.txt │ │ ├── cs.txt │ │ ├── cy.txt │ │ ├── da.txt │ │ ├── de.txt │ │ ├── el.txt │ │ ├── en.ttt │ │ ├── eo.txt │ │ ├── es.txt │ │ ├── et.txt │ │ ├── eu.txt │ │ ├── ext.txt │ │ ├── fa.txt │ │ ├── fi.txt │ │ ├── fr.txt │ │ ├── fur.txt │ │ ├── fy.txt │ │ ├── gl.txt │ │ ├── gu.txt │ │ ├── he.txt │ │ ├── hi.txt │ │ ├── hr.txt │ │ ├── hu.txt │ │ ├── hy.txt │ │ ├── id.txt │ │ ├── io.txt │ │ ├── is.txt │ │ ├── it.txt │ │ ├── ja.txt │ │ ├── ka.txt │ │ ├── kk.txt │ │ ├── ko.txt │ │ ├── ku-ckb.txt │ │ ├── ku.txt │ │ ├── lt.txt │ │ ├── lv.txt │ │ ├── mk.txt │ │ ├── mn.txt │ │ ├── mr.txt │ │ ├── ms.txt │ │ ├── nb.txt │ │ ├── ne.txt │ │ ├── nl.txt │ │ ├── nn.txt │ │ ├── pa-in.txt │ │ ├── pl.txt │ │ ├── ps.txt │ │ ├── pt-br.txt │ │ ├── pt.txt │ │ ├── ro.txt │ │ ├── ru.txt │ │ ├── sa.txt │ │ ├── si.txt │ │ ├── sk.txt │ │ ├── sl.txt │ │ ├── sq.txt │ │ ├── sr-spc.txt │ │ ├── sr-spl.txt │ │ ├── sv.txt │ │ ├── ta.txt │ │ ├── th.txt │ │ ├── tr.txt │ │ ├── tt.txt │ │ ├── ug.txt │ │ ├── uk.txt │ │ ├── uz.txt │ │ ├── va.txt │ │ ├── vi.txt │ │ ├── zh-cn.txt │ │ └── zh-tw.txt │ ├── License.txt │ ├── Uninstall.exe │ ├── descript.ion │ └── readme.txt └── NuGet │ └── NuGet.exe ├── ElCamino.AspNetCore.Identity.AzureTable.sln ├── LICENSE ├── License.txt ├── ModelClasses.dgml ├── NuGet.config ├── README.md ├── StoreClasses.dgml ├── azure-pipelines.yml ├── sample ├── .filenesting.json ├── .nuget │ ├── NuGet.Config │ ├── NuGet.exe │ └── NuGet.targets ├── .vscode │ ├── launch.json │ └── tasks.json ├── SampleMvcWeb.sln ├── samplemvccore2 │ ├── .bowerrc │ ├── Controllers │ │ ├── AccountController.cs │ │ ├── HomeController.cs │ │ └── ManageController.cs │ ├── Data │ │ └── ApplicationDbContext.cs │ ├── Extensions │ │ ├── EmailSenderExtensions.cs │ │ └── UrlHelperExtensions.cs │ ├── Models │ │ ├── AccountViewModels │ │ │ ├── ExternalLoginViewModel.cs │ │ │ ├── ForgotPasswordViewModel.cs │ │ │ ├── LoginViewModel.cs │ │ │ ├── LoginWith2faViewModel.cs │ │ │ ├── LoginWithRecoveryCodeViewModel.cs │ │ │ ├── RegisterViewModel.cs │ │ │ └── ResetPasswordViewModel.cs │ │ ├── ApplicationUser.cs │ │ ├── ErrorViewModel.cs │ │ └── ManageViewModels │ │ │ ├── ChangePasswordViewModel.cs │ │ │ ├── EnableAuthenticatorViewModel.cs │ │ │ ├── ExternalLoginsViewModel.cs │ │ │ ├── GenerateRecoveryCodesViewModel.cs │ │ │ ├── IndexViewModel.cs │ │ │ ├── RemoveLoginViewModel.cs │ │ │ ├── SetPasswordViewModel.cs │ │ │ └── TwoFactorAuthenticationViewModel.cs │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── Services │ │ ├── EmailSender.cs │ │ └── IEmailSender.cs │ ├── Startup.cs │ ├── Views │ │ ├── Account │ │ │ ├── AccessDenied.cshtml │ │ │ ├── ConfirmEmail.cshtml │ │ │ ├── ExternalLogin.cshtml │ │ │ ├── ForgotPassword.cshtml │ │ │ ├── ForgotPasswordConfirmation.cshtml │ │ │ ├── Lockout.cshtml │ │ │ ├── Login.cshtml │ │ │ ├── LoginWith2fa.cshtml │ │ │ ├── LoginWithRecoveryCode.cshtml │ │ │ ├── Register.cshtml │ │ │ ├── ResetPassword.cshtml │ │ │ ├── ResetPasswordConfirmation.cshtml │ │ │ └── SignedOut.cshtml │ │ ├── Home │ │ │ ├── About.cshtml │ │ │ ├── Contact.cshtml │ │ │ └── Index.cshtml │ │ ├── Manage │ │ │ ├── ChangePassword.cshtml │ │ │ ├── Disable2fa.cshtml │ │ │ ├── EnableAuthenticator.cshtml │ │ │ ├── ExternalLogins.cshtml │ │ │ ├── GenerateRecoveryCodes.cshtml │ │ │ ├── Index.cshtml │ │ │ ├── ManageNavPages.cs │ │ │ ├── ResetAuthenticator.cshtml │ │ │ ├── SetPassword.cshtml │ │ │ ├── TwoFactorAuthentication.cshtml │ │ │ ├── _Layout.cshtml │ │ │ ├── _ManageNav.cshtml │ │ │ ├── _StatusMessage.cshtml │ │ │ └── _ViewImports.cshtml │ │ ├── Shared │ │ │ ├── Error.cshtml │ │ │ ├── _Layout.cshtml │ │ │ ├── _LoginPartial.cshtml │ │ │ └── _ValidationScriptsPartial.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── bower.json │ ├── bundleconfig.json │ ├── libman.json │ ├── samplemvccore2.csproj │ └── wwwroot │ │ ├── css │ │ ├── site.css │ │ └── site.min.css │ │ ├── favicon.ico │ │ ├── images │ │ ├── banner1.svg │ │ ├── banner2.svg │ │ ├── banner3.svg │ │ └── banner4.svg │ │ ├── js │ │ ├── site.js │ │ └── site.min.js │ │ └── lib │ │ ├── bootstrap │ │ ├── .bower.json │ │ ├── bower.json │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ ├── grunt │ │ │ ├── .jshintrc │ │ │ ├── .stylelintrc │ │ │ ├── browsers.js │ │ │ ├── browsers.min.js │ │ │ ├── bs-commonjs-generator.js │ │ │ ├── bs-commonjs-generator.min.js │ │ │ ├── bs-glyphicons-data-generator.js │ │ │ ├── bs-glyphicons-data-generator.min.js │ │ │ ├── bs-lessdoc-parser.js │ │ │ ├── bs-lessdoc-parser.min.js │ │ │ ├── bs-raw-files-generator.js │ │ │ ├── bs-raw-files-generator.min.js │ │ │ ├── change-version.js │ │ │ ├── change-version.min.js │ │ │ ├── configBridge.json │ │ │ ├── generate-sri.js │ │ │ ├── generate-sri.min.js │ │ │ ├── karma.conf.js │ │ │ ├── karma.conf.min.js │ │ │ ├── npm-shrinkwrap.json │ │ │ └── sauce_browsers.yml │ │ ├── js │ │ │ ├── .jscsrc │ │ │ ├── .jshintrc │ │ │ ├── affix.js │ │ │ ├── affix.min.js │ │ │ ├── alert.js │ │ │ ├── alert.min.js │ │ │ ├── button.js │ │ │ ├── button.min.js │ │ │ ├── carousel.js │ │ │ ├── carousel.min.js │ │ │ ├── collapse.js │ │ │ ├── collapse.min.js │ │ │ ├── dropdown.js │ │ │ ├── dropdown.min.js │ │ │ ├── modal.js │ │ │ ├── modal.min.js │ │ │ ├── popover.js │ │ │ ├── popover.min.js │ │ │ ├── scrollspy.js │ │ │ ├── scrollspy.min.js │ │ │ ├── tab.js │ │ │ ├── tab.min.js │ │ │ ├── tooltip.js │ │ │ ├── tooltip.min.js │ │ │ ├── transition.js │ │ │ └── transition.min.js │ │ ├── less │ │ │ ├── .csscomb.json │ │ │ ├── .csslintrc │ │ │ ├── alerts.less │ │ │ ├── badges.less │ │ │ ├── bootstrap.less │ │ │ ├── breadcrumbs.less │ │ │ ├── button-groups.less │ │ │ ├── buttons.less │ │ │ ├── carousel.less │ │ │ ├── close.less │ │ │ ├── code.less │ │ │ ├── component-animations.less │ │ │ ├── dropdowns.less │ │ │ ├── forms.less │ │ │ ├── glyphicons.less │ │ │ ├── grid.less │ │ │ ├── input-groups.less │ │ │ ├── jumbotron.less │ │ │ ├── labels.less │ │ │ ├── list-group.less │ │ │ ├── media.less │ │ │ ├── mixins.less │ │ │ ├── mixins │ │ │ │ ├── alerts.less │ │ │ │ ├── background-variant.less │ │ │ │ ├── border-radius.less │ │ │ │ ├── buttons.less │ │ │ │ ├── center-block.less │ │ │ │ ├── clearfix.less │ │ │ │ ├── forms.less │ │ │ │ ├── gradients.less │ │ │ │ ├── grid-framework.less │ │ │ │ ├── grid.less │ │ │ │ ├── hide-text.less │ │ │ │ ├── image.less │ │ │ │ ├── labels.less │ │ │ │ ├── list-group.less │ │ │ │ ├── nav-divider.less │ │ │ │ ├── nav-vertical-align.less │ │ │ │ ├── opacity.less │ │ │ │ ├── pagination.less │ │ │ │ ├── panels.less │ │ │ │ ├── progress-bar.less │ │ │ │ ├── reset-filter.less │ │ │ │ ├── reset-text.less │ │ │ │ ├── resize.less │ │ │ │ ├── responsive-visibility.less │ │ │ │ ├── size.less │ │ │ │ ├── tab-focus.less │ │ │ │ ├── table-row.less │ │ │ │ ├── text-emphasis.less │ │ │ │ ├── text-overflow.less │ │ │ │ └── vendor-prefixes.less │ │ │ ├── modals.less │ │ │ ├── navbar.less │ │ │ ├── navs.less │ │ │ ├── normalize.less │ │ │ ├── pager.less │ │ │ ├── pagination.less │ │ │ ├── panels.less │ │ │ ├── popovers.less │ │ │ ├── print.less │ │ │ ├── progress-bars.less │ │ │ ├── responsive-embed.less │ │ │ ├── responsive-utilities.less │ │ │ ├── scaffolding.less │ │ │ ├── tables.less │ │ │ ├── theme.less │ │ │ ├── thumbnails.less │ │ │ ├── tooltip.less │ │ │ ├── type.less │ │ │ ├── utilities.less │ │ │ ├── variables.less │ │ │ └── wells.less │ │ ├── nuget │ │ │ ├── MyGet.ps1 │ │ │ ├── bootstrap.less.nuspec │ │ │ └── bootstrap.nuspec │ │ └── package.js │ │ ├── jquery-validation-unobtrusive │ │ ├── .bower.json │ │ ├── jquery.validate.unobtrusive.js │ │ └── jquery.validate.unobtrusive.min.js │ │ ├── jquery-validation │ │ ├── .bower.json │ │ ├── LICENSE.md │ │ ├── README.md │ │ ├── changelog.md │ │ └── package.json │ │ └── jquery │ │ ├── .bower.json │ │ ├── LICENSE.txt │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ └── jquery.min.map ├── samplemvccore3 │ ├── Areas │ │ └── Identity │ │ │ ├── IdentityHostingStartup.cs │ │ │ └── Pages │ │ │ ├── Account │ │ │ ├── AccessDenied.cshtml │ │ │ ├── AccessDenied.cshtml.cs │ │ │ ├── ConfirmEmail.cshtml │ │ │ ├── ConfirmEmail.cshtml.cs │ │ │ ├── ExternalLogin.cshtml │ │ │ ├── ExternalLogin.cshtml.cs │ │ │ ├── ForgotPassword.cshtml │ │ │ ├── ForgotPassword.cshtml.cs │ │ │ ├── ForgotPasswordConfirmation.cshtml │ │ │ ├── ForgotPasswordConfirmation.cshtml.cs │ │ │ ├── Lockout.cshtml │ │ │ ├── Lockout.cshtml.cs │ │ │ ├── Login.cshtml │ │ │ ├── Login.cshtml.cs │ │ │ ├── LoginWith2fa.cshtml │ │ │ ├── LoginWith2fa.cshtml.cs │ │ │ ├── LoginWithRecoveryCode.cshtml │ │ │ ├── LoginWithRecoveryCode.cshtml.cs │ │ │ ├── Logout.cshtml │ │ │ ├── Logout.cshtml.cs │ │ │ ├── Manage │ │ │ │ ├── ChangePassword.cshtml │ │ │ │ ├── ChangePassword.cshtml.cs │ │ │ │ ├── DeletePersonalData.cshtml │ │ │ │ ├── DeletePersonalData.cshtml.cs │ │ │ │ ├── Disable2fa.cshtml │ │ │ │ ├── Disable2fa.cshtml.cs │ │ │ │ ├── DownloadPersonalData.cshtml │ │ │ │ ├── DownloadPersonalData.cshtml.cs │ │ │ │ ├── EnableAuthenticator.cshtml │ │ │ │ ├── EnableAuthenticator.cshtml.cs │ │ │ │ ├── ExternalLogins.cshtml │ │ │ │ ├── ExternalLogins.cshtml.cs │ │ │ │ ├── GenerateRecoveryCodes.cshtml │ │ │ │ ├── GenerateRecoveryCodes.cshtml.cs │ │ │ │ ├── Index.cshtml │ │ │ │ ├── Index.cshtml.cs │ │ │ │ ├── ManageNavPages.cs │ │ │ │ ├── PersonalData.cshtml │ │ │ │ ├── PersonalData.cshtml.cs │ │ │ │ ├── ResetAuthenticator.cshtml │ │ │ │ ├── ResetAuthenticator.cshtml.cs │ │ │ │ ├── SetPassword.cshtml │ │ │ │ ├── SetPassword.cshtml.cs │ │ │ │ ├── TwoFactorAuthentication.cshtml │ │ │ │ ├── TwoFactorAuthentication.cshtml.cs │ │ │ │ ├── _Layout.cshtml │ │ │ │ ├── _ManageNav.cshtml │ │ │ │ ├── _StatusMessage.cshtml │ │ │ │ └── _ViewImports.cshtml │ │ │ ├── Register.cshtml │ │ │ ├── Register.cshtml.cs │ │ │ ├── ResetPassword.cshtml │ │ │ ├── ResetPassword.cshtml.cs │ │ │ ├── ResetPasswordConfirmation.cshtml │ │ │ ├── ResetPasswordConfirmation.cshtml.cs │ │ │ └── _ViewImports.cshtml │ │ │ ├── Error.cshtml │ │ │ ├── Error.cshtml.cs │ │ │ ├── _ValidationScriptsPartial.cshtml │ │ │ ├── _ViewImports.cshtml │ │ │ └── _ViewStart.cshtml │ ├── Controllers │ │ └── HomeController.cs │ ├── Data │ │ └── ApplicationDbContext.cs │ ├── Models │ │ ├── ApplicationUser.cs │ │ └── ErrorViewModel.cs │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── Services │ │ ├── EmailSender.cs │ │ └── IEmailSender.cs │ ├── Startup.cs │ ├── Views │ │ ├── Home │ │ │ ├── Index.cshtml │ │ │ └── Privacy.cshtml │ │ ├── Shared │ │ │ ├── Error.cshtml │ │ │ ├── _CookieConsentPartial.cshtml │ │ │ ├── _Layout.cshtml │ │ │ ├── _LoginPartial.cshtml │ │ │ └── _ValidationScriptsPartial.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── samplemvccore3.csproj │ └── wwwroot │ │ ├── css │ │ └── site.css │ │ ├── favicon.ico │ │ └── js │ │ └── site.js └── samplemvccore4 │ ├── Areas │ └── Identity │ │ ├── IdentityHostingStartup.cs │ │ └── Pages │ │ ├── Account │ │ ├── AccessDenied.cshtml │ │ ├── AccessDenied.cshtml.cs │ │ ├── ConfirmEmail.cshtml │ │ ├── ConfirmEmail.cshtml.cs │ │ ├── ConfirmEmailChange.cshtml │ │ ├── ConfirmEmailChange.cshtml.cs │ │ ├── ExternalLogin.cshtml │ │ ├── ExternalLogin.cshtml.cs │ │ ├── ForgotPassword.cshtml │ │ ├── ForgotPassword.cshtml.cs │ │ ├── ForgotPasswordConfirmation.cshtml │ │ ├── ForgotPasswordConfirmation.cshtml.cs │ │ ├── Lockout.cshtml │ │ ├── Lockout.cshtml.cs │ │ ├── Login.cshtml │ │ ├── Login.cshtml.cs │ │ ├── LoginWith2fa.cshtml │ │ ├── LoginWith2fa.cshtml.cs │ │ ├── LoginWithRecoveryCode.cshtml │ │ ├── LoginWithRecoveryCode.cshtml.cs │ │ ├── Logout.cshtml │ │ ├── Logout.cshtml.cs │ │ ├── Manage │ │ │ ├── ChangePassword.cshtml │ │ │ ├── ChangePassword.cshtml.cs │ │ │ ├── DeletePersonalData.cshtml │ │ │ ├── DeletePersonalData.cshtml.cs │ │ │ ├── Disable2fa.cshtml │ │ │ ├── Disable2fa.cshtml.cs │ │ │ ├── DownloadPersonalData.cshtml │ │ │ ├── DownloadPersonalData.cshtml.cs │ │ │ ├── Email.cshtml │ │ │ ├── Email.cshtml.cs │ │ │ ├── EnableAuthenticator.cshtml │ │ │ ├── EnableAuthenticator.cshtml.cs │ │ │ ├── ExternalLogins.cshtml │ │ │ ├── ExternalLogins.cshtml.cs │ │ │ ├── GenerateRecoveryCodes.cshtml │ │ │ ├── GenerateRecoveryCodes.cshtml.cs │ │ │ ├── Index.cshtml │ │ │ ├── Index.cshtml.cs │ │ │ ├── ManageNavPages.cs │ │ │ ├── PersonalData.cshtml │ │ │ ├── PersonalData.cshtml.cs │ │ │ ├── ResetAuthenticator.cshtml │ │ │ ├── ResetAuthenticator.cshtml.cs │ │ │ ├── SetPassword.cshtml │ │ │ ├── SetPassword.cshtml.cs │ │ │ ├── ShowRecoveryCodes.cshtml │ │ │ ├── ShowRecoveryCodes.cshtml.cs │ │ │ ├── TwoFactorAuthentication.cshtml │ │ │ ├── TwoFactorAuthentication.cshtml.cs │ │ │ ├── _Layout.cshtml │ │ │ ├── _ManageNav.cshtml │ │ │ ├── _StatusMessage.cshtml │ │ │ └── _ViewImports.cshtml │ │ ├── Register.cshtml │ │ ├── Register.cshtml.cs │ │ ├── RegisterConfirmation.cshtml │ │ ├── RegisterConfirmation.cshtml.cs │ │ ├── ResetPassword.cshtml │ │ ├── ResetPassword.cshtml.cs │ │ ├── ResetPasswordConfirmation.cshtml │ │ ├── ResetPasswordConfirmation.cshtml.cs │ │ ├── _StatusMessage.cshtml │ │ └── _ViewImports.cshtml │ │ ├── Error.cshtml │ │ ├── Error.cshtml.cs │ │ ├── _ValidationScriptsPartial.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── Controllers │ └── HomeController.cs │ ├── Data │ └── ApplicationDbContext.cs │ ├── Models │ └── ErrorViewModel.cs │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── ScaffoldingReadme.txt │ ├── Startup.cs │ ├── Views │ ├── Home │ │ ├── Index.cshtml │ │ └── Privacy.cshtml │ ├── Shared │ │ ├── Error.cshtml │ │ ├── _CookieConsentPartial.cshtml │ │ ├── _Layout.cshtml │ │ ├── _LoginPartial.cshtml │ │ └── _ValidationScriptsPartial.cshtml │ ├── _ViewImports.cshtml │ └── _ViewStart.cshtml │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ ├── samplemvccore4.csproj │ └── wwwroot │ ├── css │ └── site.css │ ├── favicon.ico │ ├── js │ └── site.js │ └── lib │ ├── bootstrap │ ├── LICENSE │ ├── README.md │ ├── js │ │ └── src │ │ │ ├── alert.js │ │ │ ├── alert.min.js │ │ │ ├── button.js │ │ │ ├── button.min.js │ │ │ ├── carousel.js │ │ │ ├── carousel.min.js │ │ │ ├── collapse.js │ │ │ ├── collapse.min.js │ │ │ ├── dropdown.js │ │ │ ├── dropdown.min.js │ │ │ ├── index.js │ │ │ ├── index.min.js │ │ │ ├── modal.js │ │ │ ├── modal.min.js │ │ │ ├── popover.js │ │ │ ├── popover.min.js │ │ │ ├── scrollspy.js │ │ │ ├── scrollspy.min.js │ │ │ ├── tab.js │ │ │ ├── tab.min.js │ │ │ ├── toast.js │ │ │ ├── toast.min.js │ │ │ ├── tools │ │ │ ├── sanitizer.js │ │ │ └── sanitizer.min.js │ │ │ ├── tooltip.js │ │ │ ├── tooltip.min.js │ │ │ ├── util.js │ │ │ └── util.min.js │ ├── package.json │ └── scss │ │ ├── _alert.scss │ │ ├── _badge.scss │ │ ├── _breadcrumb.scss │ │ ├── _button-group.scss │ │ ├── _buttons.scss │ │ ├── _card.scss │ │ ├── _carousel.scss │ │ ├── _close.scss │ │ ├── _code.scss │ │ ├── _custom-forms.scss │ │ ├── _dropdown.scss │ │ ├── _forms.scss │ │ ├── _functions.scss │ │ ├── _grid.scss │ │ ├── _images.scss │ │ ├── _input-group.scss │ │ ├── _jumbotron.scss │ │ ├── _list-group.scss │ │ ├── _media.scss │ │ ├── _mixins.scss │ │ ├── _modal.scss │ │ ├── _nav.scss │ │ ├── _navbar.scss │ │ ├── _pagination.scss │ │ ├── _popover.scss │ │ ├── _print.scss │ │ ├── _progress.scss │ │ ├── _reboot.scss │ │ ├── _root.scss │ │ ├── _spinners.scss │ │ ├── _tables.scss │ │ ├── _toasts.scss │ │ ├── _tooltip.scss │ │ ├── _transitions.scss │ │ ├── _type.scss │ │ ├── _utilities.scss │ │ ├── _variables.scss │ │ ├── bootstrap-grid.scss │ │ ├── bootstrap-reboot.scss │ │ ├── bootstrap.scss │ │ ├── mixins │ │ ├── _alert.scss │ │ ├── _background-variant.scss │ │ ├── _badge.scss │ │ ├── _border-radius.scss │ │ ├── _box-shadow.scss │ │ ├── _breakpoints.scss │ │ ├── _buttons.scss │ │ ├── _caret.scss │ │ ├── _clearfix.scss │ │ ├── _deprecate.scss │ │ ├── _float.scss │ │ ├── _forms.scss │ │ ├── _gradients.scss │ │ ├── _grid-framework.scss │ │ ├── _grid.scss │ │ ├── _hover.scss │ │ ├── _image.scss │ │ ├── _list-group.scss │ │ ├── _lists.scss │ │ ├── _nav-divider.scss │ │ ├── _pagination.scss │ │ ├── _reset-text.scss │ │ ├── _resize.scss │ │ ├── _screen-reader.scss │ │ ├── _size.scss │ │ ├── _table-row.scss │ │ ├── _text-emphasis.scss │ │ ├── _text-hide.scss │ │ ├── _text-truncate.scss │ │ ├── _transition.scss │ │ └── _visibility.scss │ │ ├── utilities │ │ ├── _align.scss │ │ ├── _background.scss │ │ ├── _borders.scss │ │ ├── _clearfix.scss │ │ ├── _display.scss │ │ ├── _embed.scss │ │ ├── _flex.scss │ │ ├── _float.scss │ │ ├── _overflow.scss │ │ ├── _position.scss │ │ ├── _screenreaders.scss │ │ ├── _shadows.scss │ │ ├── _sizing.scss │ │ ├── _spacing.scss │ │ ├── _stretched-link.scss │ │ ├── _text.scss │ │ └── _visibility.scss │ │ └── vendor │ │ └── _rfs.scss │ ├── jquery-validation-unobtrusive │ ├── LICENSE.txt │ ├── jquery.validate.unobtrusive.js │ └── jquery.validate.unobtrusive.min.js │ ├── jquery-validation │ └── LICENSE.md │ └── jquery │ └── LICENSE.txt ├── src ├── ElCamino.AspNetCore.Identity.AzureTable.Model │ ├── ElCamino.AspNetCore.Identity.AzureTable.Model.csproj │ ├── IGenerateKeys.cs │ ├── IKeyHelper.cs │ ├── IdentityConfiguration.cs │ ├── IdentityRole.cs │ ├── IdentityRoleClaim.cs │ ├── IdentityUser.cs │ ├── IdentityUserClaim.cs │ ├── IdentityUserIndex.cs │ ├── IdentityUserLogin.cs │ ├── IdentityUserRole.cs │ ├── IdentityUserToken.cs │ ├── README.md │ └── projectNugetPic.png ├── ElCamino.AspNetCore.Identity.AzureTable │ ├── ElCamino.AspNetCore.Identity.AzureTable.csproj │ ├── Helpers │ │ ├── BaseKeyHelper.cs │ │ ├── DefaultKeyHelper.cs │ │ └── SHA256KeyHelper.cs │ ├── IdentityAzureTableBuilderExtensions.cs │ ├── IdentityCloudContext.cs │ ├── IdentityResources.Designer.cs │ ├── IdentityResources.resx │ ├── RoleStore.cs │ ├── TableConstants.cs │ ├── UserOnlyStore.cs │ ├── UserStore.cs │ └── projectNugetPic.png ├── ElCamino.Azure.Data.Tables │ ├── BatchOperationHelper.cs │ ├── EdmType.cs │ ├── ElCamino.Azure.Data.Tables.csproj │ ├── EntityMapExtensions.cs │ ├── IAsyncEnumerableExtensions.cs │ ├── QueryComparison.cs │ ├── QueryComparisons.cs │ ├── README.md │ ├── TableClientExtensions.cs │ ├── TableOperator.cs │ ├── TableOperators.cs │ ├── TableQuery.cs │ ├── TableQueryBuilder.cs │ └── projectNugetPic.png └── ElCamino.Identity.AzureTable.DataUtility │ ├── ClaimMigrateRowkey.cs │ ├── ElCamino.Identity.AzureTable.DataUtility.csproj │ ├── EmailMigrateIndex.cs │ ├── IMigration.cs │ ├── LoginMigrateIndex.cs │ ├── MigrationFactory.cs │ ├── Program.cs │ ├── Properties │ ├── AssemblyInfo.cs │ ├── PublishProfiles │ │ └── FolderProfile.pubxml │ └── launchSettings.json │ ├── RoleAndClaimMigrateIndex.cs │ ├── RolesMigration.cs │ ├── TableEntityExtensions.cs │ ├── UsersMigration.cs │ ├── appsettings.json │ └── help.txt ├── templates ├── ElCamino.AspNetCore.Identity.AzureTable.Templates.csproj └── templates │ ├── StarterWebMvc-CSharp │ ├── .template.config │ │ └── template.json │ ├── Areas │ │ └── Identity │ │ │ └── Pages │ │ │ ├── Account │ │ │ ├── ConfirmEmail.cshtml.cs │ │ │ ├── ConfirmEmailChange.cshtml.cs │ │ │ ├── ExternalLogin.cshtml.cs │ │ │ ├── ForgotPassword.cshtml.cs │ │ │ ├── Login.cshtml.cs │ │ │ ├── LoginWith2fa.cshtml.cs │ │ │ ├── LoginWithRecoveryCode.cshtml.cs │ │ │ ├── Logout.cshtml.cs │ │ │ ├── Manage │ │ │ │ ├── ChangePassword.cshtml.cs │ │ │ │ ├── DeletePersonalData.cshtml.cs │ │ │ │ ├── Disable2fa.cshtml.cs │ │ │ │ ├── DownloadPersonalData.cshtml.cs │ │ │ │ ├── Email.cshtml.cs │ │ │ │ ├── EnableAuthenticator.cshtml.cs │ │ │ │ ├── ExternalLogins.cshtml.cs │ │ │ │ ├── GenerateRecoveryCodes.cshtml.cs │ │ │ │ ├── Index.cshtml.cs │ │ │ │ ├── PersonalData.cshtml.cs │ │ │ │ ├── ResetAuthenticator.cshtml.cs │ │ │ │ ├── SetPassword.cshtml.cs │ │ │ │ ├── ShowRecoveryCodes.cshtml.cs │ │ │ │ ├── TwoFactorAuthentication.cshtml.cs │ │ │ │ └── _ViewImports.cshtml │ │ │ ├── Register.cshtml.cs │ │ │ ├── RegisterConfirmation.cshtml.cs │ │ │ ├── ResendEmailConfirmation.cshtml.cs │ │ │ ├── ResetPassword.cshtml.cs │ │ │ └── _ViewImports.cshtml │ │ │ └── _ViewImports.cshtml │ ├── Controllers │ │ └── HomeController.cs │ ├── Data │ │ └── ApplicationDbContext.cs │ ├── Models │ │ └── ErrorViewModel.cs │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── ScaffoldingReadMe.txt │ ├── Views │ │ ├── Home │ │ │ ├── Index.cshtml │ │ │ └── Privacy.cshtml │ │ ├── Shared │ │ │ ├── Error.cshtml │ │ │ ├── _Layout.cshtml │ │ │ ├── _Layout.cshtml.css │ │ │ ├── _LoginPartial.cshtml │ │ │ └── _ValidationScriptsPartial.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ ├── samplemvccore.csproj │ ├── samplemvccore.sln │ └── wwwroot │ │ ├── css │ │ └── site.css │ │ ├── favicon.ico │ │ ├── js │ │ └── site.js │ │ └── lib │ │ ├── bootstrap │ │ └── LICENSE │ │ ├── jquery-validation-unobtrusive │ │ ├── LICENSE.txt │ │ ├── jquery.validate.unobtrusive.js │ │ └── jquery.validate.unobtrusive.min.js │ │ ├── jquery-validation │ │ └── LICENSE.md │ │ └── jquery │ │ └── LICENSE.txt │ └── StarterWebRazorPages-CSharp │ ├── .template.config │ └── template.json │ ├── Areas │ └── Identity │ │ └── Pages │ │ ├── Account │ │ ├── ConfirmEmail.cshtml.cs │ │ ├── ConfirmEmailChange.cshtml.cs │ │ ├── ExternalLogin.cshtml.cs │ │ ├── ForgotPassword.cshtml.cs │ │ ├── Login.cshtml.cs │ │ ├── LoginWith2fa.cshtml.cs │ │ ├── LoginWithRecoveryCode.cshtml.cs │ │ ├── Logout.cshtml.cs │ │ ├── Manage │ │ │ ├── ChangePassword.cshtml.cs │ │ │ ├── DeletePersonalData.cshtml.cs │ │ │ ├── Disable2fa.cshtml.cs │ │ │ ├── DownloadPersonalData.cshtml.cs │ │ │ ├── Email.cshtml.cs │ │ │ ├── EnableAuthenticator.cshtml.cs │ │ │ ├── ExternalLogins.cshtml.cs │ │ │ ├── GenerateRecoveryCodes.cshtml.cs │ │ │ ├── Index.cshtml.cs │ │ │ ├── PersonalData.cshtml.cs │ │ │ ├── ResetAuthenticator.cshtml.cs │ │ │ ├── SetPassword.cshtml.cs │ │ │ ├── TwoFactorAuthentication.cshtml.cs │ │ │ └── _ViewImports.cshtml │ │ ├── Register.cshtml.cs │ │ ├── RegisterConfirmation.cshtml.cs │ │ ├── ResendEmailConfirmation.cshtml.cs │ │ ├── ResetPassword.cshtml.cs │ │ └── _ViewImports.cshtml │ │ └── _ViewImports.cshtml │ ├── Data │ └── ApplicationDbContext.cs │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ ├── Index.cshtml │ ├── Index.cshtml.cs │ ├── Privacy.cshtml │ ├── Privacy.cshtml.cs │ ├── Shared │ │ ├── _Layout.cshtml │ │ ├── _Layout.cshtml.css │ │ ├── _LoginPartial.cshtml │ │ └── _ValidationScriptsPartial.cshtml │ ├── _ViewImports.cshtml │ └── _ViewStart.cshtml │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── ScaffoldingReadMe.txt │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ ├── samplerazorpagescore.csproj │ ├── samplerazorpagescore.sln │ └── wwwroot │ ├── css │ └── site.css │ ├── favicon.ico │ ├── js │ └── site.js │ └── lib │ ├── bootstrap │ └── LICENSE │ ├── jquery-validation-unobtrusive │ ├── LICENSE.txt │ ├── jquery.validate.unobtrusive.js │ └── jquery.validate.unobtrusive.min.js │ ├── jquery-validation │ └── LICENSE.md │ └── jquery │ └── LICENSE.txt ├── tests ├── ElCamino.AspNetCore.Identity.AzureTable.Tests │ ├── BaseRoleStoreTests.cs │ ├── BaseUserStoreTests.Properties.partial.cs │ ├── BaseUserStoreTests.cs │ ├── Constants.cs │ ├── ElCamino.AspNetCore.Identity.AzureTable.Tests.csproj │ ├── ExceptionHelper.cs │ ├── Fakes │ │ └── HashTestKeyHelperFake.cs │ ├── Fixtures │ │ ├── BaseFixture.cs │ │ ├── RoleFixture.cs │ │ └── UserFixture.cs │ ├── KeyHelperTests.cs │ ├── ModelTests │ │ ├── ApplicationUser.cs │ │ ├── IApplicationUser.cs │ │ ├── IdentityCloudContextTests.cs │ │ ├── IdentityRoleTests.cs │ │ ├── IdentityUserClaimTests.cs │ │ ├── IdentityUserRoleTests.cs │ │ └── IdentityUserTests.cs │ ├── RoleStoreSHA256Tests.cs │ ├── RoleStoreTests.cs │ ├── UserOnlyStoreSHA256Tests.cs │ ├── UserOnlyStoreTests.cs │ ├── UserStoreSHA256Tests.cs │ ├── UserStoreTests.cs │ └── config.json └── ElCamino.Azure.Data.Tables.Tests │ ├── BaseTest.cs │ ├── ElCamino.Azure.Data.Tables.Tests.csproj │ ├── TableClientTests.cs │ ├── TableFixture.cs │ ├── TableQueryBuilderTests.cs │ ├── TableQueryTests.cs │ └── config.json └── tools └── key.snk /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: dlmelendez 4 | custom: "https://www.paypal.me/dlmelendez" 5 | -------------------------------------------------------------------------------- /.vscode/IdentityAzureTable-Main.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "name": "main", 5 | "path": ".." 6 | } 7 | ], 8 | "settings": { 9 | "dotnet-test-explorer.testProjectPath": "**/*ElCamino.AspNetCore.Identity.AzureTable.Tests.@(csproj|vbproj|fsproj)", 10 | "omnisharp.defaultLaunchSolution": "ElCamino.AspNetCore.Identity.AzureTable.sln" 11 | } 12 | } -------------------------------------------------------------------------------- /.vscode/IdentityAzureTable-Samples.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "name": "samples", 5 | "path": "..\\sample" 6 | } 7 | ], 8 | "settings": { 9 | "omnisharp.defaultLaunchSolution": "SampleMvcWeb.sln" 10 | } 11 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "dotnet-test-explorer.testProjectPath": "**/*ElCamino.AspNetCore.Identity.AzureTable.Tests.@(csproj|vbproj|fsproj)", 3 | "omnisharp.defaultLaunchSolution": "ElCamino.AspNetCore.Identity.AzureTable.sln" 4 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "detail": "Build main identity azure table.", 6 | "label": "build", 7 | "command": "dotnet", 8 | "type": "process", 9 | "args": [ 10 | "build", 11 | "${workspaceFolder}/ElCamino.AspNetCore.Identity.AzureTable.sln", 12 | "/property:GenerateFullPaths=true", 13 | "/consoleloggerparameters:NoSummary" 14 | ], 15 | "problemMatcher": "$msCompile" 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /3rdParty/7-Zip/7-zip.chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/7-Zip/7-zip.chm -------------------------------------------------------------------------------- /3rdParty/7-Zip/7-zip.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/7-Zip/7-zip.dll -------------------------------------------------------------------------------- /3rdParty/7-Zip/7z.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/7-Zip/7z.dll -------------------------------------------------------------------------------- /3rdParty/7-Zip/7z.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/7-Zip/7z.exe -------------------------------------------------------------------------------- /3rdParty/7-Zip/7z.sfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/7-Zip/7z.sfx -------------------------------------------------------------------------------- /3rdParty/7-Zip/7zCon.sfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/7-Zip/7zCon.sfx -------------------------------------------------------------------------------- /3rdParty/7-Zip/7zFM.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/7-Zip/7zFM.exe -------------------------------------------------------------------------------- /3rdParty/7-Zip/7zG.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/7-Zip/7zG.exe -------------------------------------------------------------------------------- /3rdParty/7-Zip/Uninstall.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/7-Zip/Uninstall.exe -------------------------------------------------------------------------------- /3rdParty/7-Zip/descript.ion: -------------------------------------------------------------------------------- 1 | 7-zip.chm 7-Zip Help 2 | 7-Zip.dll 7-Zip Plugin 3 | 7z.dll 7-Zip Engine 4 | 7z.exe 7-Zip Console 5 | 7z.sfx 7-Zip GUI SFX 6 | 7zCon.sfx 7-Zip Console SFX 7 | 7zFM.exe 7-Zip File Manager 8 | 7zg.exe 7-Zip GUI 9 | descript.ion 7-Zip File Descriptions 10 | history.txt 7-Zip History 11 | Lang 7-Zip Translations 12 | license.txt 7-Zip License 13 | readme.txt 7-Zip Overview 14 | -------------------------------------------------------------------------------- /3rdParty/NuGet/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/3rdParty/NuGet/NuGet.exe -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020 dlmelendez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /NuGet.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ElCamino.AspNetCore.Identity.AzureTable 2 | ================= 3 | This project provides a high performance cloud solution for ASP.NET Identity Core using Azure Table storage replacing the Entity Framework / MSSQL provider. 4 | 5 | [![Build Status](https://dev.azure.com/elcamino/Azure%20OpenSource/_apis/build/status%2Fdlmelendez.identityazuretable?branchName=master)](https://dev.azure.com/elcamino/Azure%20OpenSource/_build/latest?definitionId=18&branchName=master) 6 | [![NuGet Version](https://img.shields.io/nuget/v/ElCamino.AspNetCore.Identity.AzureTable)](https://www.nuget.org/packages/ElCamino.AspNetCore.Identity.AzureTable/) 7 | 8 | Project site at https://elcamino.cloud/projects/docs/identityazuretable/. 9 | -------------------------------------------------------------------------------- /sample/.filenesting.json: -------------------------------------------------------------------------------- 1 | { 2 | "help":"https://go.microsoft.com/fwlink/?linkid=866610" 3 | } -------------------------------------------------------------------------------- /sample/.nuget/NuGet.Config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /sample/.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/sample/.nuget/NuGet.exe -------------------------------------------------------------------------------- /sample/samplemvccore2/.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "wwwroot/lib" 3 | } 4 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Controllers/HomeController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Mvc; 7 | using samplemvccore2.Models; 8 | 9 | namespace samplemvccore2.Controllers 10 | { 11 | public class HomeController : Controller 12 | { 13 | public IActionResult Index() 14 | { 15 | return View(); 16 | } 17 | 18 | public IActionResult About() 19 | { 20 | ViewData["Message"] = "Your application description page."; 21 | 22 | return View(); 23 | } 24 | 25 | public IActionResult Contact() 26 | { 27 | ViewData["Message"] = "Your contact page."; 28 | 29 | return View(); 30 | } 31 | 32 | public IActionResult Error() 33 | { 34 | return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Data/ApplicationDbContext.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using ElCamino.AspNetCore.Identity.AzureTable; 6 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 7 | using samplemvccore2.Models; 8 | 9 | namespace samplemvccore2.Data 10 | { 11 | public class ApplicationDbContext : IdentityCloudContext 12 | { 13 | public ApplicationDbContext() : base() { } 14 | 15 | public ApplicationDbContext(IdentityConfiguration config) : base(config) { } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Extensions/EmailSenderExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text.Encodings.Web; 5 | using System.Threading.Tasks; 6 | using samplemvccore2.Services; 7 | 8 | namespace samplemvccore2.Services 9 | { 10 | public static class EmailSenderExtensions 11 | { 12 | public static Task SendEmailConfirmationAsync(this IEmailSender emailSender, string email, string link) 13 | { 14 | return emailSender.SendEmailAsync(email, "Confirm your email", 15 | $"Please confirm your account by clicking this link: link"); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Extensions/UrlHelperExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using samplemvccore2.Controllers; 6 | 7 | namespace Microsoft.AspNetCore.Mvc 8 | { 9 | public static class UrlHelperExtensions 10 | { 11 | public static string EmailConfirmationLink(this IUrlHelper urlHelper, string userId, string code, string scheme) 12 | { 13 | return urlHelper.Action( 14 | action: nameof(AccountController.ConfirmEmail), 15 | controller: "Account", 16 | values: new { userId, code }, 17 | protocol: scheme); 18 | } 19 | 20 | public static string ResetPasswordCallbackLink(this IUrlHelper urlHelper, string userId, string code, string scheme) 21 | { 22 | return urlHelper.Action( 23 | action: nameof(AccountController.ResetPassword), 24 | controller: "Account", 25 | values: new { userId, code }, 26 | protocol: scheme); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/AccountViewModels/ExternalLoginViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.AccountViewModels 8 | { 9 | public class ExternalLoginViewModel 10 | { 11 | [Required] 12 | [EmailAddress] 13 | public string Email { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/AccountViewModels/ForgotPasswordViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.AccountViewModels 8 | { 9 | public class ForgotPasswordViewModel 10 | { 11 | [Required] 12 | [EmailAddress] 13 | public string Email { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/AccountViewModels/LoginViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.AccountViewModels 8 | { 9 | public class LoginViewModel 10 | { 11 | [Required] 12 | [EmailAddress] 13 | public string Email { get; set; } 14 | 15 | [Required] 16 | [DataType(DataType.Password)] 17 | public string Password { get; set; } 18 | 19 | [Display(Name = "Remember me?")] 20 | public bool RememberMe { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/AccountViewModels/LoginWith2faViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.AccountViewModels 8 | { 9 | public class LoginWith2faViewModel 10 | { 11 | [Required] 12 | [StringLength(7, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] 13 | [DataType(DataType.Text)] 14 | [Display(Name = "Authenticator code")] 15 | public string TwoFactorCode { get; set; } 16 | 17 | [Display(Name = "Remember this machine")] 18 | public bool RememberMachine { get; set; } 19 | 20 | public bool RememberMe { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/AccountViewModels/LoginWithRecoveryCodeViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.AccountViewModels 8 | { 9 | public class LoginWithRecoveryCodeViewModel 10 | { 11 | [Required] 12 | [DataType(DataType.Text)] 13 | [Display(Name = "Recovery Code")] 14 | public string RecoveryCode { get; set; } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/AccountViewModels/RegisterViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.AccountViewModels 8 | { 9 | public class RegisterViewModel 10 | { 11 | [Required] 12 | [EmailAddress] 13 | [Display(Name = "Email")] 14 | public string Email { get; set; } 15 | 16 | [Required] 17 | [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] 18 | [DataType(DataType.Password)] 19 | [Display(Name = "Password")] 20 | public string Password { get; set; } 21 | 22 | [DataType(DataType.Password)] 23 | [Display(Name = "Confirm password")] 24 | [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 25 | public string ConfirmPassword { get; set; } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/AccountViewModels/ResetPasswordViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.AccountViewModels 8 | { 9 | public class ResetPasswordViewModel 10 | { 11 | [Required] 12 | [EmailAddress] 13 | public string Email { get; set; } 14 | 15 | [Required] 16 | [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] 17 | [DataType(DataType.Password)] 18 | public string Password { get; set; } 19 | 20 | [DataType(DataType.Password)] 21 | [Display(Name = "Confirm password")] 22 | [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 23 | public string ConfirmPassword { get; set; } 24 | 25 | public string Code { get; set; } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ApplicationUser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 6 | 7 | namespace samplemvccore2.Models 8 | { 9 | // Add profile data for application users by adding properties to the ApplicationUser class 10 | public class ApplicationUser : IdentityUser 11 | { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ErrorViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace samplemvccore2.Models 4 | { 5 | public class ErrorViewModel 6 | { 7 | public string RequestId { get; set; } 8 | 9 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 10 | } 11 | } -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ManageViewModels/ChangePasswordViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.ManageViewModels 8 | { 9 | public class ChangePasswordViewModel 10 | { 11 | [Required] 12 | [DataType(DataType.Password)] 13 | [Display(Name = "Current password")] 14 | public string OldPassword { get; set; } 15 | 16 | [Required] 17 | [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] 18 | [DataType(DataType.Password)] 19 | [Display(Name = "New password")] 20 | public string NewPassword { get; set; } 21 | 22 | [DataType(DataType.Password)] 23 | [Display(Name = "Confirm new password")] 24 | [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] 25 | public string ConfirmPassword { get; set; } 26 | 27 | public string StatusMessage { get; set; } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ManageViewModels/EnableAuthenticatorViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.ComponentModel.DataAnnotations; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | 8 | namespace samplemvccore2.Models.ManageViewModels 9 | { 10 | public class EnableAuthenticatorViewModel 11 | { 12 | [Required] 13 | [StringLength(7, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] 14 | [DataType(DataType.Text)] 15 | [Display(Name = "Verification Code")] 16 | public string Code { get; set; } 17 | 18 | [ReadOnly(true)] 19 | public string SharedKey { get; set; } 20 | 21 | public string AuthenticatorUri { get; set; } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ManageViewModels/ExternalLoginsViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Authentication; 6 | using Microsoft.AspNetCore.Identity; 7 | 8 | namespace samplemvccore2.Models.ManageViewModels 9 | { 10 | public class ExternalLoginsViewModel 11 | { 12 | public IList CurrentLogins { get; set; } 13 | 14 | public IList OtherLogins { get; set; } 15 | 16 | public bool ShowRemoveButton { get; set; } 17 | 18 | public string StatusMessage { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ManageViewModels/GenerateRecoveryCodesViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.ManageViewModels 8 | { 9 | public class GenerateRecoveryCodesViewModel 10 | { 11 | public string[] RecoveryCodes { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ManageViewModels/IndexViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.ManageViewModels 8 | { 9 | public class IndexViewModel 10 | { 11 | public string Username { get; set; } 12 | 13 | public bool IsEmailConfirmed { get; set; } 14 | 15 | [Required] 16 | [EmailAddress] 17 | public string Email { get; set; } 18 | 19 | [Phone] 20 | [Display(Name = "Phone number")] 21 | public string PhoneNumber { get; set; } 22 | 23 | public string StatusMessage { get; set; } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ManageViewModels/RemoveLoginViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.ManageViewModels 8 | { 9 | public class RemoveLoginViewModel 10 | { 11 | public string LoginProvider { get; set; } 12 | public string ProviderKey { get; set; } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ManageViewModels/SetPasswordViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.ManageViewModels 8 | { 9 | public class SetPasswordViewModel 10 | { 11 | [Required] 12 | [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] 13 | [DataType(DataType.Password)] 14 | [Display(Name = "New password")] 15 | public string NewPassword { get; set; } 16 | 17 | [DataType(DataType.Password)] 18 | [Display(Name = "Confirm new password")] 19 | [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] 20 | public string ConfirmPassword { get; set; } 21 | 22 | public string StatusMessage { get; set; } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Models/ManageViewModels/TwoFactorAuthenticationViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore2.Models.ManageViewModels 8 | { 9 | public class TwoFactorAuthenticationViewModel 10 | { 11 | public bool HasAuthenticator { get; set; } 12 | 13 | public int RecoveryCodesLeft { get; set; } 14 | 15 | public bool Is2faEnabled { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore; 7 | using Microsoft.AspNetCore.Hosting; 8 | using Microsoft.Extensions.Configuration; 9 | using Microsoft.Extensions.Logging; 10 | 11 | namespace samplemvccore2 12 | { 13 | public class Program 14 | { 15 | public static void Main(string[] args) 16 | { 17 | BuildWebHost(args).Run(); 18 | } 19 | 20 | public static IWebHost BuildWebHost(string[] args) => 21 | WebHost.CreateDefaultBuilder(args) 22 | .UseStartup() 23 | .Build(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:14172/", 7 | "sslPort": 44371 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "launchUrl": "https://localhost:44371/", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "samplemvccore2": { 20 | "commandName": "Project", 21 | "launchBrowser": true, 22 | "environmentVariables": { 23 | "ASPNETCORE_ENVIRONMENT": "Development" 24 | }, 25 | "applicationUrl": "http://localhost:14173/" 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Services/EmailSender.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace samplemvccore2.Services 7 | { 8 | // This class is used by the application to send email for account confirmation and password reset. 9 | // For more details see https://go.microsoft.com/fwlink/?LinkID=532713 10 | public class EmailSender : IEmailSender 11 | { 12 | public Task SendEmailAsync(string email, string subject, string message) 13 | { 14 | return Task.CompletedTask; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Services/IEmailSender.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace samplemvccore2.Services 7 | { 8 | public interface IEmailSender 9 | { 10 | Task SendEmailAsync(string email, string subject, string message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Account/AccessDenied.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Access denied"; 3 | } 4 | 5 |
6 |

ViewData["Title"]

7 |

You do not have access to this resource.

8 |
9 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Account/ConfirmEmail.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Confirm email"; 3 | } 4 | 5 |

@ViewData["Title"]

6 |
7 |

8 | Thank you for confirming your email. 9 |

10 |
11 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Account/ForgotPassword.cshtml: -------------------------------------------------------------------------------- 1 | @model ForgotPasswordViewModel 2 | @{ 3 | ViewData["Title"] = "Forgot your password?"; 4 | } 5 | 6 |

@ViewData["Title"]

7 |

Enter your email.

8 |
9 |
10 |
11 |
12 |
13 |
14 | 15 | 16 | 17 |
18 | 19 |
20 |
21 |
22 | 23 | @section Scripts { 24 | @await Html.PartialAsync("_ValidationScriptsPartial") 25 | } 26 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Account/ForgotPasswordConfirmation.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Forgot password confirmation"; 3 | } 4 | 5 |

@ViewData["Title"]

6 |

7 | Please check your email to reset your password. 8 |

9 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Account/Lockout.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Locked out"; 3 | } 4 | 5 |
6 |

@ViewData["Title"]

7 |

This account has been locked out, please try again later.

8 |
9 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Account/LoginWithRecoveryCode.cshtml: -------------------------------------------------------------------------------- 1 | @model LoginWithRecoveryCodeViewModel 2 | @{ 3 | ViewData["Title"] = "Recovery code verification"; 4 | } 5 | 6 |

@ViewData["Title"]

7 |
8 |

9 | You have requested to login with a recovery code. This login will not be remembered until you provide 10 | an authenticator app code at login or disable 2FA and login again. 11 |

12 |
13 |
14 |
15 |
16 |
17 | 18 | 19 | 20 |
21 | 22 |
23 |
24 |
25 | 26 | @section Scripts { 27 | @await Html.PartialAsync("_ValidationScriptsPartial") 28 | } -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Account/ResetPasswordConfirmation.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Reset password confirmation"; 3 | } 4 | 5 |

@ViewData["Title"]

6 |

7 | Your password has been reset. Please click here to log in. 8 |

9 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Account/SignedOut.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Signed out"; 3 | } 4 | 5 |

@ViewData["Title"]

6 |

7 | You have successfully signed out. 8 |

9 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Home/About.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "About"; 3 | } 4 |

@ViewData["Title"]

5 |

@ViewData["Message"]

6 | 7 |

Use this area to provide additional information.

8 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Home/Contact.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Contact"; 3 | } 4 |

@ViewData["Title"]

5 |

@ViewData["Message"]

6 | 7 |
8 | One Microsoft Way
9 | Redmond, WA 98052-6399
10 | P: 11 | 425.555.0100 12 |
13 | 14 |
15 | Support: Support@example.com
16 | Marketing: Marketing@example.com 17 |
18 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Manage/Disable2fa.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Disable two-factor authentication (2FA)"; 3 | ViewData.AddActivePage(ManageNavPages.TwoFactorAuthentication); 4 | } 5 | 6 |

@ViewData["Title"]

7 | 8 | 19 | 20 |
21 |
22 | 23 |
24 |
25 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Manage/GenerateRecoveryCodes.cshtml: -------------------------------------------------------------------------------- 1 | @model GenerateRecoveryCodesViewModel 2 | @{ 3 | ViewData["Title"] = "Recovery codes"; 4 | ViewData.AddActivePage(ManageNavPages.TwoFactorAuthentication); 5 | } 6 | 7 |

@ViewData["Title"]

8 | 17 |
18 |
19 | @for (var row = 0; row < Model.RecoveryCodes.Count(); row += 2) 20 | { 21 | @Model.RecoveryCodes[row] @Model.RecoveryCodes[row + 1]
22 | } 23 |
24 |
-------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Manage/ResetAuthenticator.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Reset authenticator key"; 3 | ViewData.AddActivePage(ManageNavPages.TwoFactorAuthentication); 4 | } 5 | 6 |

@ViewData["Title"]

7 | 17 |
18 |
19 | 20 |
21 |
-------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Manage/_Layout.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "/Views/Shared/_Layout.cshtml"; 3 | } 4 | 5 |

Manage your account

6 | 7 |
8 |

Change your account settings

9 |
10 |
11 |
12 | @await Html.PartialAsync("_ManageNav") 13 |
14 |
15 | @RenderBody() 16 |
17 |
18 |
19 | 20 | @section Scripts { 21 | @RenderSection("Scripts", required: false) 22 | } 23 | 24 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Manage/_ManageNav.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore2.Views.Manage 2 | @inject SignInManager SignInManager 3 | @{ 4 | var hasExternalLogins = (await SignInManager.GetExternalAuthenticationSchemesAsync()).Any(); 5 | } 6 | 7 | 16 | 17 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Manage/_StatusMessage.cshtml: -------------------------------------------------------------------------------- 1 | @model string 2 | 3 | @if (!String.IsNullOrEmpty(Model)) 4 | { 5 | var statusMessageClass = Model.StartsWith("Error") ? "danger" : "success"; 6 | 10 | } 11 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Manage/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore2.Views.Manage -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Shared/Error.cshtml: -------------------------------------------------------------------------------- 1 | @model ErrorViewModel 2 | @{ 3 | ViewData["Title"] = "Error"; 4 | } 5 | 6 |

Error.

7 |

An error occurred while processing your request.

8 | 9 | @if (Model.ShowRequestId) 10 | { 11 |

12 | Request ID: @Model.RequestId 13 |

14 | } 15 | 16 |

Development Mode

17 |

18 | Swapping to Development environment will display more detailed information about the error that occurred. 19 |

20 |

21 | Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application. 22 |

23 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/Shared/_LoginPartial.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @using samplemvccore2.Models 3 | 4 | @inject SignInManager SignInManager 5 | @inject UserManager UserManager 6 | 7 | @if (SignInManager.IsSignedIn(User)) 8 | { 9 | 19 | } 20 | else 21 | { 22 | 26 | } 27 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @using samplemvccore2 3 | @using samplemvccore2.Models 4 | @using samplemvccore2.Models.AccountViewModels 5 | @using samplemvccore2.Models.ManageViewModels 6 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 7 | -------------------------------------------------------------------------------- /sample/samplemvccore2/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /sample/samplemvccore2/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "IncludeScopes": false, 4 | "LogLevel": { 5 | "Default": "Debug", 6 | "System": "Information", 7 | "Microsoft": "Information" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /sample/samplemvccore2/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "ConnectionStrings": { 3 | "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-samplemvccore2-3E82D7EB-CAE0-449D-98F7-1AB93D0E5FE4;Trusted_Connection=True;MultipleActiveResultSets=true" 4 | }, 5 | "IdentityAzureTable": { 6 | "IdentityConfiguration": { 7 | "TablePrefix": "v2", 8 | "StorageConnectionString": "UseDevelopmentStorage=true;", 9 | "LocationMode": "PrimaryOnly" 10 | } 11 | }, 12 | "Logging": { 13 | "IncludeScopes": false, 14 | "LogLevel": { 15 | "Default": "Warning" 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sample/samplemvccore2/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asp.net", 3 | "private": true, 4 | "dependencies": { 5 | "bootstrap": "3.4.1", 6 | "jquery": "2.2.0", 7 | "jquery-validation": "1.14.0", 8 | "jquery-validation-unobtrusive": "3.2.6" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /sample/samplemvccore2/bundleconfig.json: -------------------------------------------------------------------------------- 1 | // Configure bundling and minification for the project. 2 | // More info at https://go.microsoft.com/fwlink/?LinkId=808241 3 | [ 4 | { 5 | "outputFileName": "wwwroot/css/site.min.css", 6 | // An array of relative input file paths. Globbing patterns supported 7 | "inputFiles": [ 8 | "wwwroot/css/site.css" 9 | ] 10 | }, 11 | { 12 | "outputFileName": "wwwroot/js/site.min.js", 13 | "inputFiles": [ 14 | "wwwroot/js/site.js" 15 | ], 16 | // Optionally specify minification options 17 | "minify": { 18 | "enabled": true, 19 | "renameLocals": true 20 | }, 21 | // Optionally generate .map file 22 | "sourceMap": false 23 | } 24 | ] 25 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/css/site.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 50px; 3 | padding-bottom: 20px; 4 | } 5 | 6 | /* Wrapping element */ 7 | /* Set some basic padding to keep content from hitting the edges */ 8 | .body-content { 9 | padding-left: 15px; 10 | padding-right: 15px; 11 | } 12 | 13 | /* Carousel */ 14 | .carousel-caption p { 15 | font-size: 20px; 16 | line-height: 1.4; 17 | } 18 | 19 | /* Make .svg files in the carousel display properly in older browsers */ 20 | .carousel-inner .item img[src$=".svg"] { 21 | width: 100%; 22 | } 23 | 24 | /* QR code generator */ 25 | #qrCode { 26 | margin: 15px; 27 | } 28 | 29 | /* Hide/rearrange for smaller screens */ 30 | @media screen and (max-width: 767px) { 31 | /* Hide captions */ 32 | .carousel-caption { 33 | display: none; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/css/site.min.css: -------------------------------------------------------------------------------- 1 | body{padding-top:50px;padding-bottom:20px}.body-content{padding-left:15px;padding-right:15px}.carousel-caption p{font-size:20px;line-height:1.4}.carousel-inner .item img[src$=".svg"]{width:100%}#qrCode{margin:15px}@media screen and (max-width:767px){.carousel-caption{display:none}} -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/sample/samplemvccore2/wwwroot/favicon.ico -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/js/site.js: -------------------------------------------------------------------------------- 1 | // Write your JavaScript code. 2 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/js/site.min.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/sample/samplemvccore2/wwwroot/js/site.min.js -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", 4 | "keywords": [ 5 | "css", 6 | "js", 7 | "less", 8 | "mobile-first", 9 | "responsive", 10 | "front-end", 11 | "framework", 12 | "web" 13 | ], 14 | "homepage": "http://getbootstrap.com", 15 | "license": "MIT", 16 | "moduleType": "globals", 17 | "main": [ 18 | "less/bootstrap.less", 19 | "dist/js/bootstrap.js" 20 | ], 21 | "ignore": [ 22 | "/.*", 23 | "_config.yml", 24 | "CNAME", 25 | "composer.json", 26 | "CONTRIBUTING.md", 27 | "docs", 28 | "js/tests", 29 | "test-infra" 30 | ], 31 | "dependencies": { 32 | "jquery": "1.9.1 - 3" 33 | }, 34 | "version": "3.3.7", 35 | "_release": "3.3.7", 36 | "_resolution": { 37 | "type": "version", 38 | "tag": "v3.3.7", 39 | "commit": "0b9c4a4007c44201dce9a6cc1a38407005c26c86" 40 | }, 41 | "_source": "https://github.com/twbs/bootstrap.git", 42 | "_target": "3.3.7", 43 | "_originalSource": "bootstrap" 44 | } -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", 4 | "keywords": [ 5 | "css", 6 | "js", 7 | "less", 8 | "mobile-first", 9 | "responsive", 10 | "front-end", 11 | "framework", 12 | "web" 13 | ], 14 | "homepage": "http://getbootstrap.com", 15 | "license": "MIT", 16 | "moduleType": "globals", 17 | "main": [ 18 | "less/bootstrap.less", 19 | "dist/js/bootstrap.js" 20 | ], 21 | "ignore": [ 22 | "/.*", 23 | "_config.yml", 24 | "CNAME", 25 | "composer.json", 26 | "CONTRIBUTING.md", 27 | "docs", 28 | "js/tests", 29 | "test-infra" 30 | ], 31 | "dependencies": { 32 | "jquery": "1.9.1 - 3" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/sample/samplemvccore2/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/sample/samplemvccore2/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/sample/samplemvccore2/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/sample/samplemvccore2/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/grunt/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends" : "../js/.jshintrc", 3 | "asi" : false, 4 | "browser" : false, 5 | "es3" : false, 6 | "node" : true 7 | } 8 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/grunt/bs-commonjs-generator.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Minified by jsDelivr using Terser v3.14.1. 3 | * Original file: /npm/bootstrap@3.4.1/grunt/bs-commonjs-generator.js 4 | * 5 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 6 | */ 7 | "use strict";var fs=require("fs"),path=require("path"),COMMONJS_BANNER="// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\n";module.exports=function(e,r,i){var t=path.dirname(i);var n=COMMONJS_BANNER+r.map(function(e){return"require('"+path.posix.relative(t,e)+"')"}).join("\n");try{fs.writeFileSync(i,n)}catch(r){e.fail.warn(r)}e.log.writeln("File "+i.cyan+" created.")}; 8 | //# sourceMappingURL=/sm/8dbedf46824596045ee0052b869ad3ce9e2edeb07504675cde5e7c22ebb07cef.map -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/grunt/bs-glyphicons-data-generator.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Minified by jsDelivr using Terser v3.14.1. 3 | * Original file: /npm/bootstrap@3.4.1/grunt/bs-glyphicons-data-generator.js 4 | * 5 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 6 | */ 7 | "use strict";var fs=require("fs");module.exports=function(s){for(var t=fs.readFileSync("less/glyphicons.less","utf8").split("\n"),e=/^\.(glyphicon-[a-zA-Z0-9-]+)/,i="# This file is generated via Grunt task. **Do not edit directly.**\n# See the 'build-glyphicons-data' task in Gruntfile.js.\n\n",n=0,a=t.length;n li { 14 | display: inline-block; 15 | 16 | + li:before { 17 | padding: 0 5px; 18 | color: @breadcrumb-color; 19 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space 20 | } 21 | } 22 | 23 | > .active { 24 | color: @breadcrumb-active-color; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/close.less: -------------------------------------------------------------------------------- 1 | // stylelint-disable property-no-vendor-prefix 2 | 3 | // 4 | // Close icons 5 | // -------------------------------------------------- 6 | 7 | 8 | .close { 9 | float: right; 10 | font-size: (@font-size-base * 1.5); 11 | font-weight: @close-font-weight; 12 | line-height: 1; 13 | color: @close-color; 14 | text-shadow: @close-text-shadow; 15 | .opacity(.2); 16 | 17 | &:hover, 18 | &:focus { 19 | color: @close-color; 20 | text-decoration: none; 21 | cursor: pointer; 22 | .opacity(.5); 23 | } 24 | 25 | // Additional properties for button version 26 | // iOS requires the button element instead of an anchor tag. 27 | // If you want the anchor version, it requires `href="#"`. 28 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile 29 | button& { 30 | padding: 0; 31 | cursor: pointer; 32 | background: transparent; 33 | border: 0; 34 | -webkit-appearance: none; 35 | appearance: none; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/component-animations.less: -------------------------------------------------------------------------------- 1 | // stylelint-disable selector-no-qualifying-type 2 | 3 | // 4 | // Component animations 5 | // -------------------------------------------------- 6 | 7 | // Heads up! 8 | // 9 | // We don't use the `.opacity()` mixin here since it causes a bug with text 10 | // fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. 11 | 12 | .fade { 13 | opacity: 0; 14 | .transition(opacity .15s linear); 15 | 16 | &.in { 17 | opacity: 1; 18 | } 19 | } 20 | 21 | .collapse { 22 | display: none; 23 | 24 | &.in { display: block; } 25 | tr&.in { display: table-row; } 26 | tbody&.in { display: table-row-group; } 27 | } 28 | 29 | .collapsing { 30 | position: relative; 31 | height: 0; 32 | overflow: hidden; 33 | .transition-property(~"height, visibility"); 34 | .transition-duration(.35s); 35 | .transition-timing-function(ease); 36 | } 37 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/alerts.less: -------------------------------------------------------------------------------- 1 | // Alerts 2 | 3 | .alert-variant(@background; @border; @text-color) { 4 | color: @text-color; 5 | background-color: @background; 6 | border-color: @border; 7 | 8 | hr { 9 | border-top-color: darken(@border, 5%); 10 | } 11 | 12 | .alert-link { 13 | color: darken(@text-color, 10%); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/background-variant.less: -------------------------------------------------------------------------------- 1 | // Contextual backgrounds 2 | 3 | .bg-variant(@color) { 4 | background-color: @color; 5 | a&:hover, 6 | a&:focus { 7 | background-color: darken(@color, 10%); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/border-radius.less: -------------------------------------------------------------------------------- 1 | // Single side border-radius 2 | 3 | .border-top-radius(@radius) { 4 | border-top-left-radius: @radius; 5 | border-top-right-radius: @radius; 6 | } 7 | .border-right-radius(@radius) { 8 | border-top-right-radius: @radius; 9 | border-bottom-right-radius: @radius; 10 | } 11 | .border-bottom-radius(@radius) { 12 | border-bottom-right-radius: @radius; 13 | border-bottom-left-radius: @radius; 14 | } 15 | .border-left-radius(@radius) { 16 | border-top-left-radius: @radius; 17 | border-bottom-left-radius: @radius; 18 | } 19 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/center-block.less: -------------------------------------------------------------------------------- 1 | // Center-align a block level element 2 | 3 | .center-block() { 4 | display: block; 5 | margin-right: auto; 6 | margin-left: auto; 7 | } 8 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/clearfix.less: -------------------------------------------------------------------------------- 1 | // Clearfix 2 | // 3 | // For modern browsers 4 | // 1. The space content is one way to avoid an Opera bug when the 5 | // contenteditable attribute is included anywhere else in the document. 6 | // Otherwise it causes space to appear at the top and bottom of elements 7 | // that are clearfixed. 8 | // 2. The use of `table` rather than `block` is only necessary if using 9 | // `:before` to contain the top-margins of child elements. 10 | // 11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/ 12 | 13 | .clearfix() { 14 | &:before, 15 | &:after { 16 | display: table; // 2 17 | content: " "; // 1 18 | } 19 | &:after { 20 | clear: both; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/hide-text.less: -------------------------------------------------------------------------------- 1 | // stylelint-disable font-family-name-quotes, font-family-no-missing-generic-family-keyword 2 | 3 | // CSS image replacement 4 | // 5 | // Heads up! v3 launched with only `.hide-text()`, but per our pattern for 6 | // mixins being reused as classes with the same name, this doesn't hold up. As 7 | // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. 8 | // 9 | // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 10 | 11 | // Deprecated as of v3.0.1 (has been removed in v4) 12 | .hide-text() { 13 | font: ~"0/0" a; 14 | color: transparent; 15 | text-shadow: none; 16 | background-color: transparent; 17 | border: 0; 18 | } 19 | 20 | // New mixin to use as of v3.0.1 21 | .text-hide() { 22 | .hide-text(); 23 | } 24 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/labels.less: -------------------------------------------------------------------------------- 1 | // Labels 2 | 3 | .label-variant(@color) { 4 | background-color: @color; 5 | 6 | &[href] { 7 | &:hover, 8 | &:focus { 9 | background-color: darken(@color, 10%); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/list-group.less: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | .list-group-item-variant(@state; @background; @color) { 4 | .list-group-item-@{state} { 5 | color: @color; 6 | background-color: @background; 7 | 8 | a&, 9 | button& { 10 | color: @color; 11 | 12 | .list-group-item-heading { 13 | color: inherit; 14 | } 15 | 16 | &:hover, 17 | &:focus { 18 | color: @color; 19 | background-color: darken(@background, 5%); 20 | } 21 | &.active, 22 | &.active:hover, 23 | &.active:focus { 24 | color: #fff; 25 | background-color: @color; 26 | border-color: @color; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/nav-divider.less: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | .nav-divider(@color: #e5e5e5) { 6 | height: 1px; 7 | margin: ((@line-height-computed / 2) - 1) 0; 8 | overflow: hidden; 9 | background-color: @color; 10 | } 11 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/nav-vertical-align.less: -------------------------------------------------------------------------------- 1 | // Navbar vertical align 2 | // 3 | // Vertically center elements in the navbar. 4 | // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. 5 | 6 | .navbar-vertical-align(@element-height) { 7 | margin-top: ((@navbar-height - @element-height) / 2); 8 | margin-bottom: ((@navbar-height - @element-height) / 2); 9 | } 10 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/opacity.less: -------------------------------------------------------------------------------- 1 | // Opacity 2 | 3 | .opacity(@opacity) { 4 | @opacity-ie: (@opacity * 100); // IE8 filter 5 | filter: ~"alpha(opacity=@{opacity-ie})"; 6 | opacity: @opacity; 7 | } 8 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/pagination.less: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | .pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { 4 | > li { 5 | > a, 6 | > span { 7 | padding: @padding-vertical @padding-horizontal; 8 | font-size: @font-size; 9 | line-height: @line-height; 10 | } 11 | &:first-child { 12 | > a, 13 | > span { 14 | .border-left-radius(@border-radius); 15 | } 16 | } 17 | &:last-child { 18 | > a, 19 | > span { 20 | .border-right-radius(@border-radius); 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/panels.less: -------------------------------------------------------------------------------- 1 | // Panels 2 | 3 | .panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) { 4 | border-color: @border; 5 | 6 | & > .panel-heading { 7 | color: @heading-text-color; 8 | background-color: @heading-bg-color; 9 | border-color: @heading-border; 10 | 11 | + .panel-collapse > .panel-body { 12 | border-top-color: @border; 13 | } 14 | .badge { 15 | color: @heading-bg-color; 16 | background-color: @heading-text-color; 17 | } 18 | } 19 | & > .panel-footer { 20 | + .panel-collapse > .panel-body { 21 | border-bottom-color: @border; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/progress-bar.less: -------------------------------------------------------------------------------- 1 | // Progress bars 2 | 3 | .progress-bar-variant(@color) { 4 | background-color: @color; 5 | 6 | // Deprecated parent class requirement as of v3.2.0 7 | .progress-striped & { 8 | #gradient > .striped(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/reset-filter.less: -------------------------------------------------------------------------------- 1 | // Reset filters for IE 2 | // 3 | // When you need to remove a gradient background, do not forget to use this to reset 4 | // the IE filter for IE9 and below. 5 | 6 | .reset-filter() { 7 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); 8 | } 9 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/reset-text.less: -------------------------------------------------------------------------------- 1 | .reset-text() { 2 | font-family: @font-family-base; 3 | // We deliberately do NOT reset font-size. 4 | font-style: normal; 5 | font-weight: 400; 6 | line-height: @line-height-base; 7 | line-break: auto; 8 | text-align: left; // Fallback for where `start` is not supported 9 | text-align: start; 10 | text-decoration: none; 11 | text-shadow: none; 12 | text-transform: none; 13 | letter-spacing: normal; 14 | word-break: normal; 15 | word-spacing: normal; 16 | word-wrap: normal; 17 | white-space: normal; 18 | } 19 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/resize.less: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | .resizable(@direction) { 4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 5 | resize: @direction; // Options: horizontal, vertical, both 6 | } 7 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/responsive-visibility.less: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .responsive-visibility() { 4 | display: block !important; 5 | table& { display: table !important; } 6 | tr& { display: table-row !important; } 7 | th&, 8 | td& { display: table-cell !important; } 9 | } 10 | 11 | .responsive-invisibility() { 12 | display: none !important; 13 | } 14 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/size.less: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | .size(@width; @height) { 4 | width: @width; 5 | height: @height; 6 | } 7 | 8 | .square(@size) { 9 | .size(@size; @size); 10 | } 11 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/tab-focus.less: -------------------------------------------------------------------------------- 1 | // WebKit-style focus 2 | 3 | .tab-focus() { 4 | // WebKit-specific. Other browsers will keep their default outline style. 5 | // (Initially tried to also force default via `outline: initial`, 6 | // but that seems to erroneously remove the outline in Firefox altogether.) 7 | outline: 5px auto -webkit-focus-ring-color; 8 | outline-offset: -2px; 9 | } 10 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/table-row.less: -------------------------------------------------------------------------------- 1 | // Tables 2 | 3 | .table-row-variant(@state; @background) { 4 | // Exact selectors below required to override `.table-striped` and prevent 5 | // inheritance to nested tables. 6 | .table > thead > tr, 7 | .table > tbody > tr, 8 | .table > tfoot > tr { 9 | > td.@{state}, 10 | > th.@{state}, 11 | &.@{state} > td, 12 | &.@{state} > th { 13 | background-color: @background; 14 | } 15 | } 16 | 17 | // Hover states for `.table-hover` 18 | // Note: this is not available for cells or rows within `thead` or `tfoot`. 19 | .table-hover > tbody > tr { 20 | > td.@{state}:hover, 21 | > th.@{state}:hover, 22 | &.@{state}:hover > td, 23 | &:hover > .@{state}, 24 | &.@{state}:hover > th { 25 | background-color: darken(@background, 5%); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/text-emphasis.less: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | .text-emphasis-variant(@color) { 4 | color: @color; 5 | a&:hover, 6 | a&:focus { 7 | color: darken(@color, 10%); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/mixins/text-overflow.less: -------------------------------------------------------------------------------- 1 | // Text overflow 2 | // Requires inline-block or block for proper styling 3 | 4 | .text-overflow() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: @line-height-computed 0; 9 | text-align: center; 10 | list-style: none; 11 | &:extend(.clearfix all); 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: @pager-bg; 19 | border: 1px solid @pager-border; 20 | border-radius: @pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: @pager-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: @pager-disabled-color; 50 | cursor: @cursor-disabled; 51 | background-color: @pager-bg; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/responsive-embed.less: -------------------------------------------------------------------------------- 1 | // Embeds responsive 2 | // 3 | // Credit: Nicolas Gallagher and SUIT CSS. 4 | 5 | .embed-responsive { 6 | position: relative; 7 | display: block; 8 | height: 0; 9 | padding: 0; 10 | overflow: hidden; 11 | 12 | .embed-responsive-item, 13 | iframe, 14 | embed, 15 | object, 16 | video { 17 | position: absolute; 18 | top: 0; 19 | bottom: 0; 20 | left: 0; 21 | width: 100%; 22 | height: 100%; 23 | border: 0; 24 | } 25 | } 26 | 27 | // Modifier class for 16:9 aspect ratio 28 | .embed-responsive-16by9 { 29 | padding-bottom: 56.25%; 30 | } 31 | 32 | // Modifier class for 4:3 aspect ratio 33 | .embed-responsive-4by3 { 34 | padding-bottom: 75%; 35 | } 36 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // stylelint-disable selector-no-qualifying-type 2 | 3 | // 4 | // Thumbnails 5 | // -------------------------------------------------- 6 | 7 | 8 | // Mixin and adjust the regular image class 9 | .thumbnail { 10 | display: block; 11 | padding: @thumbnail-padding; 12 | margin-bottom: @line-height-computed; 13 | line-height: @line-height-base; 14 | background-color: @thumbnail-bg; 15 | border: 1px solid @thumbnail-border; 16 | border-radius: @thumbnail-border-radius; 17 | .transition(border .2s ease-in-out); 18 | 19 | > img, 20 | a > img { 21 | &:extend(.img-responsive); 22 | margin-right: auto; 23 | margin-left: auto; 24 | } 25 | 26 | // Add a hover state for linked versions only 27 | a&:hover, 28 | a&:focus, 29 | a&.active { 30 | border-color: @link-color; 31 | } 32 | 33 | // Image captions 34 | .caption { 35 | padding: @thumbnail-caption-padding; 36 | color: @thumbnail-caption-color; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/utilities.less: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // 4 | // Utility classes 5 | // -------------------------------------------------- 6 | 7 | 8 | // Floats 9 | // ------------------------- 10 | 11 | .clearfix { 12 | .clearfix(); 13 | } 14 | .center-block { 15 | .center-block(); 16 | } 17 | .pull-right { 18 | float: right !important; 19 | } 20 | .pull-left { 21 | float: left !important; 22 | } 23 | 24 | 25 | // Toggling content 26 | // ------------------------- 27 | 28 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 29 | .hide { 30 | display: none !important; 31 | } 32 | .show { 33 | display: block !important; 34 | } 35 | .invisible { 36 | visibility: hidden; 37 | } 38 | .text-hide { 39 | .text-hide(); 40 | } 41 | 42 | 43 | // Hide from screenreaders and browsers 44 | // 45 | // Credit: HTML5 Boilerplate 46 | 47 | .hidden { 48 | display: none !important; 49 | } 50 | 51 | 52 | // For Affix plugin 53 | // ------------------------- 54 | 55 | .affix { 56 | position: fixed; 57 | } 58 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/less/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @well-bg; 12 | border: 1px solid @well-border; 13 | border-radius: @border-radius-base; 14 | .box-shadow(inset 0 1px 1px rgba(0, 0, 0, .05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0, 0, 0, .15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: @border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: @border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/nuget/MyGet.ps1: -------------------------------------------------------------------------------- 1 | $nuget = $env:NuGet 2 | 3 | # parse the version number out of package.json 4 | $bsversion = ((Get-Content $env:SourcesPath\package.json) -join "`n" | ConvertFrom-Json).version 5 | 6 | # create packages 7 | & $nuget pack "nuget\bootstrap.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion 8 | & $nuget pack "nuget\bootstrap.less.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion 9 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/bootstrap/package.js: -------------------------------------------------------------------------------- 1 | // package metadata file for Meteor.js 2 | 3 | /* jshint strict:false */ 4 | /* global Package:true */ 5 | 6 | Package.describe({ 7 | name: 'twbs:bootstrap', // http://atmospherejs.com/twbs/bootstrap 8 | summary: 'The most popular front-end framework for developing responsive, mobile first projects on the web.', 9 | version: '3.3.7', 10 | git: 'https://github.com/twbs/bootstrap.git' 11 | }); 12 | 13 | Package.onUse(function (api) { 14 | api.versionsFrom('METEOR@1.0'); 15 | api.use('jquery', 'client'); 16 | var assets = [ 17 | 'dist/fonts/glyphicons-halflings-regular.eot', 18 | 'dist/fonts/glyphicons-halflings-regular.svg', 19 | 'dist/fonts/glyphicons-halflings-regular.ttf', 20 | 'dist/fonts/glyphicons-halflings-regular.woff', 21 | 'dist/fonts/glyphicons-halflings-regular.woff2' 22 | ]; 23 | if (api.addAssets) { 24 | api.addAssets(assets, 'client'); 25 | } else { 26 | api.addFiles(assets, 'client', { isAsset: true }); 27 | } 28 | api.addFiles([ 29 | 'dist/css/bootstrap.css', 30 | 'dist/js/bootstrap.js' 31 | ], 'client'); 32 | }); 33 | -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/jquery-validation/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-validation", 3 | "homepage": "http://jqueryvalidation.org/", 4 | "repository": { 5 | "type": "git", 6 | "url": "git://github.com/jzaefferer/jquery-validation.git" 7 | }, 8 | "authors": [ 9 | "Jörn Zaefferer " 10 | ], 11 | "description": "Form validation made easy", 12 | "main": "dist/jquery.validate.js", 13 | "keywords": [ 14 | "forms", 15 | "validation", 16 | "validate" 17 | ], 18 | "license": "MIT", 19 | "ignore": [ 20 | "**/.*", 21 | "node_modules", 22 | "bower_components", 23 | "test", 24 | "demo", 25 | "lib" 26 | ], 27 | "dependencies": { 28 | "jquery": ">= 1.7.2" 29 | }, 30 | "version": "1.14.0", 31 | "_release": "1.14.0", 32 | "_resolution": { 33 | "type": "version", 34 | "tag": "1.14.0", 35 | "commit": "c1343fb9823392aa9acbe1c3ffd337b8c92fed48" 36 | }, 37 | "_source": "git://github.com/jzaefferer/jquery-validation.git", 38 | "_target": ">=1.8", 39 | "_originalSource": "jquery-validation" 40 | } -------------------------------------------------------------------------------- /sample/samplemvccore2/wwwroot/lib/jquery/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "main": "dist/jquery.js", 4 | "license": "MIT", 5 | "ignore": [ 6 | "package.json" 7 | ], 8 | "keywords": [ 9 | "jquery", 10 | "javascript", 11 | "browser", 12 | "library" 13 | ], 14 | "homepage": "https://github.com/jquery/jquery-dist", 15 | "version": "2.2.0", 16 | "_release": "2.2.0", 17 | "_resolution": { 18 | "type": "version", 19 | "tag": "2.2.0", 20 | "commit": "6fc01e29bdad0964f62ef56d01297039cdcadbe5" 21 | }, 22 | "_source": "git://github.com/jquery/jquery-dist.git", 23 | "_target": "2.2.0", 24 | "_originalSource": "jquery" 25 | } -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/IdentityHostingStartup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.AspNetCore.Hosting; 3 | using Microsoft.AspNetCore.Identity; 4 | using Microsoft.Extensions.Configuration; 5 | using Microsoft.Extensions.DependencyInjection; 6 | using samplemvccore3.Data; 7 | 8 | [assembly: HostingStartup(typeof(samplemvccore3.Areas.Identity.IdentityHostingStartup))] 9 | namespace samplemvccore3.Areas.Identity 10 | { 11 | public class IdentityHostingStartup : IHostingStartup 12 | { 13 | public void Configure(IWebHostBuilder builder) 14 | { 15 | builder.ConfigureServices((context, services) => { 16 | }); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/AccessDenied.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model AccessDeniedModel 3 | @{ 4 | ViewData["Title"] = "Access denied"; 5 | } 6 | 7 |
8 |

@ViewData["Title"]

9 |

You do not have access to this resource.

10 |
11 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/AccessDenied.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Mvc.RazorPages; 6 | 7 | namespace samplemvccore3.Areas.Identity.Pages.Account 8 | { 9 | public class AccessDeniedModel : PageModel 10 | { 11 | public void OnGet() 12 | { 13 | 14 | } 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/ConfirmEmail.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ConfirmEmailModel 3 | @{ 4 | ViewData["Title"] = "Confirm email"; 5 | } 6 | 7 |

@ViewData["Title"]

8 |
9 |

10 | Thank you for confirming your email. 11 |

12 |
13 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/ForgotPassword.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ForgotPasswordModel 3 | @{ 4 | ViewData["Title"] = "Forgot your password?"; 5 | } 6 | 7 |

@ViewData["Title"]

8 |

Enter your email.

9 |
10 |
11 |
12 |
13 |
14 |
15 | 16 | 17 | 18 |
19 | 20 |
21 |
22 |
23 | 24 | @section Scripts { 25 | 26 | } 27 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ForgotPasswordConfirmation 3 | @{ 4 | ViewData["Title"] = "Forgot password confirmation"; 5 | } 6 | 7 |

@ViewData["Title"]

8 |

9 | Please check your email to reset your password. 10 |

11 | 12 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Microsoft.AspNetCore.Authorization; 5 | using Microsoft.AspNetCore.Mvc.RazorPages; 6 | 7 | namespace samplemvccore3.Areas.Identity.Pages.Account 8 | { 9 | [AllowAnonymous] 10 | public class ForgotPasswordConfirmation : PageModel 11 | { 12 | public void OnGet() 13 | { 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Lockout.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model LockoutModel 3 | @{ 4 | ViewData["Title"] = "Locked out"; 5 | } 6 | 7 |
8 |

@ViewData["Title"]

9 |

This account has been locked out, please try again later.

10 |
11 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Lockout.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Authorization; 6 | using Microsoft.AspNetCore.Mvc.RazorPages; 7 | 8 | namespace samplemvccore3.Areas.Identity.Pages.Account 9 | { 10 | [AllowAnonymous] 11 | public class LockoutModel : PageModel 12 | { 13 | public void OnGet() 14 | { 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/LoginWithRecoveryCode.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model LoginWithRecoveryCodeModel 3 | @{ 4 | ViewData["Title"] = "Recovery code verification"; 5 | } 6 | 7 |

@ViewData["Title"]

8 |
9 |

10 | You have requested to log in with a recovery code. This login will not be remembered until you provide 11 | an authenticator app code at log in or disable 2FA and log in again. 12 |

13 |
14 |
15 |
16 |
17 |
18 | 19 | 20 | 21 |
22 | 23 |
24 |
25 |
26 | 27 | @section Scripts { 28 | 29 | } 30 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Logout.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model LogoutModel 3 | @{ 4 | ViewData["Title"] = "Log out"; 5 | } 6 | 7 |
8 |

@ViewData["Title"]

9 |

You have successfully logged out of the application.

10 |
-------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Manage/Disable2fa.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model Disable2faModel 3 | @{ 4 | ViewData["Title"] = "Disable two-factor authentication (2FA)"; 5 | ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; 6 | } 7 | 8 | 9 |

@ViewData["Title"]

10 | 11 | 21 | 22 |
23 |
24 | 25 |
26 |
27 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model DownloadPersonalDataModel 3 | @{ 4 | ViewData["Title"] = "Download Your Data"; 5 | ViewData["ActivePage"] = ManageNavPages.PersonalData; 6 | } 7 | 8 |

@ViewData["Title"]

9 | 10 | @section Scripts { 11 | 12 | } -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model PersonalDataModel 3 | @{ 4 | ViewData["Title"] = "Personal Data"; 5 | ViewData["ActivePage"] = ManageNavPages.PersonalData; 6 | } 7 | 8 |

@ViewData["Title"]

9 | 10 |
11 |
12 |

Your account contains personal data that you have given us. This page allows you to download or delete that data.

13 |

14 | Deleting this data will permanently remove your account, and this cannot be recovered. 15 |

16 |
17 | 18 |
19 |

20 | Delete 21 |

22 |
23 |
24 | 25 | @section Scripts { 26 | 27 | } -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Manage/ResetAuthenticator.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ResetAuthenticatorModel 3 | @{ 4 | ViewData["Title"] = "Reset authenticator key"; 5 | ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; 6 | } 7 | 8 | 9 |

@ViewData["Title"]

10 | 20 |
21 |
22 | 23 |
24 |
-------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Manage/_Layout.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "/Areas/Identity/Pages/_Layout.cshtml"; 3 | } 4 | 5 |

Manage your account

6 | 7 |
8 |

Change your account settings

9 |
10 |
11 |
12 | 13 |
14 |
15 | @RenderBody() 16 |
17 |
18 |
19 | 20 | @section Scripts { 21 | @RenderSection("Scripts", required: false) 22 | } 23 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Manage/_StatusMessage.cshtml: -------------------------------------------------------------------------------- 1 | @model string 2 | 3 | @if (!String.IsNullOrEmpty(Model)) 4 | { 5 | var statusMessageClass = Model.StartsWith("Error") ? "danger" : "success"; 6 | 10 | } -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore3.Areas.Identity.Pages.Account.Manage 2 | @using samplemvccore3.Models 3 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ResetPasswordConfirmationModel 3 | @{ 4 | ViewData["Title"] = "Reset password confirmation"; 5 | } 6 | 7 |

@ViewData["Title"]

8 |

9 | Your password has been reset. Please click here to log in. 10 |

11 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Authorization; 6 | using Microsoft.AspNetCore.Mvc.RazorPages; 7 | 8 | namespace samplemvccore3.Areas.Identity.Pages.Account 9 | { 10 | [AllowAnonymous] 11 | public class ResetPasswordConfirmationModel : PageModel 12 | { 13 | public void OnGet() 14 | { 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Account/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore3.Areas.Identity.Pages.Account 2 | @using samplemvccore3.Models -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Error.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ErrorModel 3 | @{ 4 | ViewData["Title"] = "Error"; 5 | } 6 | 7 |

Error.

8 |

An error occurred while processing your request.

9 | 10 | @if (Model.ShowRequestId) 11 | { 12 |

13 | Request ID: @Model.RequestId 14 |

15 | } 16 | 17 |

Development Mode

18 |

19 | Swapping to Development environment will display more detailed information about the error that occurred. 20 |

21 |

22 | Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application. 23 |

24 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/Error.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using Microsoft.AspNetCore.Authorization; 3 | using Microsoft.AspNetCore.Mvc; 4 | using Microsoft.AspNetCore.Mvc.RazorPages; 5 | 6 | namespace samplemvccore3.Areas.Identity.Pages 7 | { 8 | [AllowAnonymous] 9 | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 10 | public class ErrorModel : PageModel 11 | { 12 | public string RequestId { get; set; } 13 | 14 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 15 | 16 | public void OnGet() 17 | { 18 | RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/_ValidationScriptsPartial.cshtml: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @using samplemvccore3.Areas.Identity 3 | @using samplemvccore3.Models 4 | @namespace samplemvccore3.Areas.Identity.Pages 5 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 6 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Areas/Identity/Pages/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "/Views/Shared/_Layout.cshtml"; 3 | } 4 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Controllers/HomeController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Mvc; 7 | using samplemvccore3.Models; 8 | 9 | namespace samplemvccore3.Controllers 10 | { 11 | public class HomeController : Controller 12 | { 13 | public IActionResult Index() 14 | { 15 | return View(); 16 | } 17 | 18 | public IActionResult Privacy() 19 | { 20 | return View(); 21 | } 22 | 23 | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 24 | public IActionResult Error() 25 | { 26 | return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Data/ApplicationDbContext.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using ElCamino.AspNetCore.Identity.AzureTable; 5 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 6 | 7 | namespace samplemvccore3.Data 8 | { 9 | public class ApplicationDbContext : IdentityCloudContext 10 | { 11 | public ApplicationDbContext() : base() 12 | { 13 | } 14 | 15 | public ApplicationDbContext(IdentityConfiguration config) : base(config) 16 | { 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Models/ApplicationUser.cs: -------------------------------------------------------------------------------- 1 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace samplemvccore3.Models 8 | { 9 | public class ApplicationUser : IdentityUser //or use IdentityUser if your code depends on the Role, Claim and Token collections 10 | { 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Models/ErrorViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace samplemvccore3.Models 4 | { 5 | public class ErrorViewModel 6 | { 7 | public string RequestId { get; set; } 8 | 9 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 10 | } 11 | } -------------------------------------------------------------------------------- /sample/samplemvccore3/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore; 7 | using Microsoft.AspNetCore.Hosting; 8 | using Microsoft.Extensions.Configuration; 9 | using Microsoft.Extensions.Logging; 10 | 11 | namespace samplemvccore3 12 | { 13 | public class Program 14 | { 15 | public static void Main(string[] args) 16 | { 17 | CreateWebHostBuilder(args).Build().Run(); 18 | } 19 | 20 | public static IWebHostBuilder CreateWebHostBuilder(string[] args) => 21 | WebHost.CreateDefaultBuilder(args) 22 | .UseStartup(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "https://localhost:44385/", 7 | "sslPort": 44385 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "environmentVariables": { 15 | "ASPNETCORE_ENVIRONMENT": "Development" 16 | } 17 | }, 18 | "samplemvccore3": { 19 | "commandName": "Project", 20 | "launchBrowser": true, 21 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 22 | "environmentVariables": { 23 | "ASPNETCORE_ENVIRONMENT": "Development" 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /sample/samplemvccore3/Services/EmailSender.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace samplemvccore3.Services 7 | { 8 | // This class is used by the application to send email for account confirmation and password reset. 9 | // For more details see https://go.microsoft.com/fwlink/?LinkID=532713 10 | public class EmailSender : IEmailSender 11 | { 12 | public Task SendEmailAsync(string email, string subject, string message) 13 | { 14 | return Task.CompletedTask; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Services/IEmailSender.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace samplemvccore3.Services 7 | { 8 | public interface IEmailSender 9 | { 10 | Task SendEmailAsync(string email, string subject, string message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Views/Home/Index.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Home Page"; 3 | } 4 | 5 |
6 |

Welcome

7 |

Learn about building Web apps with ASP.NET Core.

8 |
9 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Views/Home/Privacy.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Privacy Policy"; 3 | } 4 |

@ViewData["Title"]

5 | 6 |

Use this page to detail your site's privacy policy.

7 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Views/Shared/Error.cshtml: -------------------------------------------------------------------------------- 1 | @model ErrorViewModel 2 | @{ 3 | ViewData["Title"] = "Error"; 4 | } 5 | 6 |

Error.

7 |

An error occurred while processing your request.

8 | 9 | @if (Model.ShowRequestId) 10 | { 11 |

12 | Request ID: @Model.RequestId 13 |

14 | } 15 | 16 |

Development Mode

17 |

18 | Swapping to Development environment will display more detailed information about the error that occurred. 19 |

20 |

21 | The Development environment shouldn't be enabled for deployed applications. 22 | It can result in displaying sensitive information from exceptions to end users. 23 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 24 | and restarting the app. 25 |

26 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Views/Shared/_LoginPartial.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @inject SignInManager SignInManager 3 | @inject UserManager UserManager 4 | 5 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore3 2 | @using samplemvccore3.Models 3 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 4 | -------------------------------------------------------------------------------- /sample/samplemvccore3/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /sample/samplemvccore3/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /sample/samplemvccore3/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "IdentityAzureTable": { 3 | "IdentityConfiguration": { 4 | "TablePrefix": "v2", 5 | "StorageConnectionString": "UseDevelopmentStorage=true;", 6 | "LocationMode": "PrimaryOnly", 7 | "IndexTableName": "AspNetIndex", 8 | "RoleTableName": "AspNetRoles", 9 | "UserTableName": "AspNetUsers" 10 | } 11 | }, 12 | "Logging": { 13 | "LogLevel": { 14 | "Default": "Warning" 15 | } 16 | }, 17 | "AllowedHosts": "*" 18 | } 19 | -------------------------------------------------------------------------------- /sample/samplemvccore3/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/sample/samplemvccore3/wwwroot/favicon.ico -------------------------------------------------------------------------------- /sample/samplemvccore3/wwwroot/js/site.js: -------------------------------------------------------------------------------- 1 | // Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification 2 | // for details on configuring this project to bundle and minify static web assets. 3 | 4 | // Write your JavaScript code. 5 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/IdentityHostingStartup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.AspNetCore.Hosting; 3 | using Microsoft.AspNetCore.Identity; 4 | using Microsoft.AspNetCore.Identity.UI; 5 | using Microsoft.Extensions.Configuration; 6 | using Microsoft.Extensions.DependencyInjection; 7 | using samplemvccore4.Data; 8 | 9 | [assembly: HostingStartup(typeof(samplemvccore4.Areas.Identity.IdentityHostingStartup))] 10 | namespace samplemvccore4.Areas.Identity 11 | { 12 | public class IdentityHostingStartup : IHostingStartup 13 | { 14 | public void Configure(IWebHostBuilder builder) 15 | { 16 | builder.ConfigureServices((context, services) => { 17 | }); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/AccessDenied.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model AccessDeniedModel 3 | @{ 4 | ViewData["Title"] = "Access denied"; 5 | } 6 | 7 |
8 |

@ViewData["Title"]

9 |

You do not have access to this resource.

10 |
11 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/AccessDenied.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Mvc.RazorPages; 6 | 7 | namespace samplemvccore4.Areas.Identity.Pages.Account 8 | { 9 | public class AccessDeniedModel : PageModel 10 | { 11 | public void OnGet() 12 | { 13 | 14 | } 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/ConfirmEmail.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ConfirmEmailModel 3 | @{ 4 | ViewData["Title"] = "Confirm email"; 5 | } 6 | 7 |

@ViewData["Title"]

8 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/ConfirmEmailChange.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ConfirmEmailChangeModel 3 | @{ 4 | ViewData["Title"] = "Confirm email change"; 5 | } 6 | 7 |

@ViewData["Title"]

8 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/ForgotPassword.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ForgotPasswordModel 3 | @{ 4 | ViewData["Title"] = "Forgot your password?"; 5 | } 6 | 7 |

@ViewData["Title"]

8 |

Enter your email.

9 |
10 |
11 |
12 |
13 |
14 |
15 | 16 | 17 | 18 |
19 | 20 |
21 |
22 |
23 | 24 | @section Scripts { 25 | 26 | } 27 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ForgotPasswordConfirmation 3 | @{ 4 | ViewData["Title"] = "Forgot password confirmation"; 5 | } 6 | 7 |

@ViewData["Title"]

8 |

9 | Please check your email to reset your password. 10 |

11 | 12 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Microsoft.AspNetCore.Authorization; 5 | using Microsoft.AspNetCore.Mvc.RazorPages; 6 | 7 | namespace samplemvccore4.Areas.Identity.Pages.Account 8 | { 9 | [AllowAnonymous] 10 | public class ForgotPasswordConfirmation : PageModel 11 | { 12 | public void OnGet() 13 | { 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Lockout.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model LockoutModel 3 | @{ 4 | ViewData["Title"] = "Locked out"; 5 | } 6 | 7 |
8 |

@ViewData["Title"]

9 |

This account has been locked out, please try again later.

10 |
11 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Lockout.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Authorization; 6 | using Microsoft.AspNetCore.Mvc.RazorPages; 7 | 8 | namespace samplemvccore4.Areas.Identity.Pages.Account 9 | { 10 | [AllowAnonymous] 11 | public class LockoutModel : PageModel 12 | { 13 | public void OnGet() 14 | { 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/LoginWithRecoveryCode.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model LoginWithRecoveryCodeModel 3 | @{ 4 | ViewData["Title"] = "Recovery code verification"; 5 | } 6 | 7 |

@ViewData["Title"]

8 |
9 |

10 | You have requested to log in with a recovery code. This login will not be remembered until you provide 11 | an authenticator app code at log in or disable 2FA and log in again. 12 |

13 |
14 |
15 |
16 |
17 |
18 | 19 | 20 | 21 |
22 | 23 |
24 |
25 |
26 | 27 | @section Scripts { 28 | 29 | } 30 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Logout.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model LogoutModel 3 | @{ 4 | ViewData["Title"] = "Log out"; 5 | } 6 | 7 |
8 |

@ViewData["Title"]

9 |

You have successfully logged out of the application.

10 |
-------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Manage/Disable2fa.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model Disable2faModel 3 | @{ 4 | ViewData["Title"] = "Disable two-factor authentication (2FA)"; 5 | ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; 6 | } 7 | 8 | 9 |

@ViewData["Title"]

10 | 11 | 20 | 21 |
22 |
23 | 24 |
25 |
26 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model DownloadPersonalDataModel 3 | @{ 4 | ViewData["Title"] = "Download Your Data"; 5 | ViewData["ActivePage"] = ManageNavPages.PersonalData; 6 | } 7 | 8 |

@ViewData["Title"]

9 | 10 | @section Scripts { 11 | 12 | } -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model PersonalDataModel 3 | @{ 4 | ViewData["Title"] = "Personal Data"; 5 | ViewData["ActivePage"] = ManageNavPages.PersonalData; 6 | } 7 | 8 |

@ViewData["Title"]

9 | 10 |
11 |
12 |

Your account contains personal data that you have given us. This page allows you to download or delete that data.

13 |

14 | Deleting this data will permanently remove your account, and this cannot be recovered. 15 |

16 |
17 | 18 |
19 |

20 | Delete 21 |

22 |
23 |
24 | 25 | @section Scripts { 26 | 27 | } -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Manage/ResetAuthenticator.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ResetAuthenticatorModel 3 | @{ 4 | ViewData["Title"] = "Reset authenticator key"; 5 | ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; 6 | } 7 | 8 | 9 |

@ViewData["Title"]

10 | 20 |
21 |
22 | 23 |
24 |
-------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Manage/ShowRecoveryCodes.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ShowRecoveryCodesModel 3 | @{ 4 | ViewData["Title"] = "Recovery codes"; 5 | ViewData["ActivePage"] = "TwoFactorAuthentication"; 6 | } 7 | 8 | 9 |

@ViewData["Title"]

10 | 18 |
19 |
20 | @for (var row = 0; row < Model.RecoveryCodes.Length; row += 2) 21 | { 22 | @Model.RecoveryCodes[row] @Model.RecoveryCodes[row + 1]
23 | } 24 |
25 |
-------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Manage/ShowRecoveryCodes.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Identity; 6 | using Microsoft.AspNetCore.Mvc; 7 | using Microsoft.AspNetCore.Mvc.RazorPages; 8 | using Microsoft.Extensions.Logging; 9 | 10 | namespace samplemvccore4.Areas.Identity.Pages.Account.Manage 11 | { 12 | public class ShowRecoveryCodesModel : PageModel 13 | { 14 | [TempData] 15 | public string[] RecoveryCodes { get; set; } 16 | 17 | [TempData] 18 | public string StatusMessage { get; set; } 19 | 20 | public IActionResult OnGet() 21 | { 22 | if (RecoveryCodes == null || RecoveryCodes.Length == 0) 23 | { 24 | return RedirectToPage("./TwoFactorAuthentication"); 25 | } 26 | 27 | return Page(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Manage/_Layout.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "/Areas/Identity/Pages/_Layout.cshtml"; 3 | } 4 | 5 |

Manage your account

6 | 7 |
8 |

Change your account settings

9 |
10 |
11 |
12 | 13 |
14 |
15 | @RenderBody() 16 |
17 |
18 |
19 | 20 | @section Scripts { 21 | @RenderSection("Scripts", required: false) 22 | } 23 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Manage/_StatusMessage.cshtml: -------------------------------------------------------------------------------- 1 | @model string 2 | 3 | @if (!String.IsNullOrEmpty(Model)) 4 | { 5 | var statusMessageClass = Model.StartsWith("Error") ? "danger" : "success"; 6 | 10 | } -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore4.Areas.Identity.Pages.Account.Manage 2 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser 3 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/RegisterConfirmation.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model RegisterConfirmationModel 3 | @{ 4 | ViewData["Title"] = "Register confirmation"; 5 | } 6 | 7 |

@ViewData["Title"]

8 | @{ 9 | if (@Model.DisplayConfirmAccountLink) 10 | { 11 |

12 | This app does not currently have a real email sender registered, see these docs for how to configure a real email sender. 13 | Normally this would be emailed: Click here to confirm your account 14 |

15 | } 16 | else 17 | { 18 |

19 | Please check your email to confirm your account. 20 |

21 | } 22 | } 23 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ResetPasswordConfirmationModel 3 | @{ 4 | ViewData["Title"] = "Reset password confirmation"; 5 | } 6 | 7 |

@ViewData["Title"]

8 |

9 | Your password has been reset. Please click here to log in. 10 |

11 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Authorization; 6 | using Microsoft.AspNetCore.Mvc.RazorPages; 7 | 8 | namespace samplemvccore4.Areas.Identity.Pages.Account 9 | { 10 | [AllowAnonymous] 11 | public class ResetPasswordConfirmationModel : PageModel 12 | { 13 | public void OnGet() 14 | { 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/_StatusMessage.cshtml: -------------------------------------------------------------------------------- 1 | @model string 2 | 3 | @if (!String.IsNullOrEmpty(Model)) 4 | { 5 | var statusMessageClass = Model.StartsWith("Error") ? "danger" : "success"; 6 | 10 | } 11 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Account/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore4.Areas.Identity.Pages.Account 2 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Error.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ErrorModel 3 | @{ 4 | ViewData["Title"] = "Error"; 5 | } 6 | 7 |

Error.

8 |

An error occurred while processing your request.

9 | 10 | @if (Model.ShowRequestId) 11 | { 12 |

13 | Request ID: @Model.RequestId 14 |

15 | } 16 | 17 |

Development Mode

18 |

19 | Swapping to Development environment will display more detailed information about the error that occurred. 20 |

21 |

22 | Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application. 23 |

24 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/Error.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using Microsoft.AspNetCore.Authorization; 3 | using Microsoft.AspNetCore.Mvc; 4 | using Microsoft.AspNetCore.Mvc.RazorPages; 5 | 6 | namespace samplemvccore4.Areas.Identity.Pages 7 | { 8 | [AllowAnonymous] 9 | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 10 | public class ErrorModel : PageModel 11 | { 12 | public string RequestId { get; set; } 13 | 14 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 15 | 16 | public void OnGet() 17 | { 18 | RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @using samplemvccore4.Areas.Identity 3 | @using samplemvccore4.Areas.Identity.Pages 4 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 5 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Areas/Identity/Pages/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "/Views/Shared/_Layout.cshtml"; 3 | } 4 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Controllers/HomeController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Mvc; 7 | using Microsoft.Extensions.Logging; 8 | using samplemvccore4.Models; 9 | 10 | namespace samplemvccore4.Controllers 11 | { 12 | public class HomeController : Controller 13 | { 14 | private readonly ILogger _logger; 15 | 16 | public HomeController(ILogger logger) 17 | { 18 | _logger = logger; 19 | } 20 | 21 | public IActionResult Index() 22 | { 23 | return View(); 24 | } 25 | 26 | public IActionResult Privacy() 27 | { 28 | return View(); 29 | } 30 | 31 | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 32 | public IActionResult Error() 33 | { 34 | return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Data/ApplicationDbContext.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using ElCamino.AspNetCore.Identity.AzureTable; 5 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 6 | 7 | namespace samplemvccore4.Data 8 | { 9 | public class ApplicationDbContext : IdentityCloudContext 10 | { 11 | public ApplicationDbContext() : base() 12 | { 13 | } 14 | 15 | public ApplicationDbContext(IdentityConfiguration config) : base(config) 16 | { 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Models/ErrorViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace samplemvccore4.Models 4 | { 5 | public class ErrorViewModel 6 | { 7 | public string RequestId { get; set; } 8 | 9 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Hosting; 6 | using Microsoft.Extensions.Configuration; 7 | using Microsoft.Extensions.Hosting; 8 | using Microsoft.Extensions.Logging; 9 | 10 | namespace samplemvccore4 11 | { 12 | public class Program 13 | { 14 | public static void Main(string[] args) 15 | { 16 | CreateHostBuilder(args).Build().Run(); 17 | } 18 | 19 | public static IHostBuilder CreateHostBuilder(string[] args) => 20 | Host.CreateDefaultBuilder(args) 21 | .ConfigureWebHostDefaults(webBuilder => 22 | { 23 | webBuilder.UseStartup(); 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:62593", 7 | "sslPort": 44335 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "environmentVariables": { 15 | "ASPNETCORE_ENVIRONMENT": "Development" 16 | } 17 | }, 18 | "samplemvccore4": { 19 | "commandName": "Project", 20 | "launchBrowser": true, 21 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 22 | "environmentVariables": { 23 | "ASPNETCORE_ENVIRONMENT": "Development" 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Views/Home/Index.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Home Page"; 3 | } 4 | 5 |
6 |

Welcome

7 |

Learn about building Web apps with ASP.NET Core.

8 |
9 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Views/Home/Privacy.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Privacy Policy"; 3 | } 4 |

@ViewData["Title"]

5 | 6 |

Use this page to detail your site's privacy policy.

7 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Views/Shared/Error.cshtml: -------------------------------------------------------------------------------- 1 | @model ErrorViewModel 2 | @{ 3 | ViewData["Title"] = "Error"; 4 | } 5 | 6 |

Error.

7 |

An error occurred while processing your request.

8 | 9 | @if (Model.ShowRequestId) 10 | { 11 |

12 | Request ID: @Model.RequestId 13 |

14 | } 15 | 16 |

Development Mode

17 |

18 | Swapping to Development environment will display more detailed information about the error that occurred. 19 |

20 |

21 | The Development environment shouldn't be enabled for deployed applications. 22 | It can result in displaying sensitive information from exceptions to end users. 23 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 24 | and restarting the app. 25 |

26 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Views/Shared/_CookieConsentPartial.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Http.Features 2 | 3 | @{ 4 | var consentFeature = Context.Features.Get(); 5 | var showBanner = !consentFeature?.CanTrack ?? false; 6 | var cookieString = consentFeature?.CreateConsentCookie(); 7 | } 8 | 9 | @if (showBanner) 10 | { 11 | 17 | 25 | } -------------------------------------------------------------------------------- /sample/samplemvccore4/Views/Shared/_LoginPartial.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @inject SignInManager SignInManager 3 | @inject UserManager UserManager 4 | 5 | 27 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Views/Shared/_ValidationScriptsPartial.cshtml: -------------------------------------------------------------------------------- 1 |  2 | 3 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore4 2 | @using samplemvccore4.Models 3 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser 4 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 5 | -------------------------------------------------------------------------------- /sample/samplemvccore4/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /sample/samplemvccore4/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /sample/samplemvccore4/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "IdentityAzureTable": { 3 | "IdentityConfiguration": { 4 | "TablePrefix": "v3", 5 | "StorageConnectionString": "UseDevelopmentStorage=true;", 6 | "LocationMode": "PrimaryOnly", 7 | "IndexTableName": "AspNetIndex", 8 | "RoleTableName": "AspNetRoles", 9 | "UserTableName": "AspNetUsers" 10 | } 11 | }, 12 | "Logging": { 13 | "LogLevel": { 14 | "Default": "Information", 15 | "Microsoft": "Warning", 16 | "Microsoft.Hosting.Lifetime": "Information" 17 | } 18 | }, 19 | "AllowedHosts": "*" 20 | } 21 | -------------------------------------------------------------------------------- /sample/samplemvccore4/libman.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "defaultProvider": "cdnjs", 4 | "libraries": [ 5 | { 6 | "provider": "jsdelivr", 7 | "library": "bootstrap@4.4.1", 8 | "destination": "wwwroot/lib/bootstrap/" 9 | }, 10 | { 11 | "library": "jquery@3.4.1", 12 | "destination": "wwwroot/lib/jquery/dist/" 13 | }, 14 | { 15 | "library": "jquery-validation-unobtrusive@3.2.11", 16 | "destination": "wwwroot/lib/jquery-validation-unobtrusive/" 17 | } 18 | , 19 | { 20 | "library": "jquery-validate@1.19.1", 21 | "destination": "wwwroot/lib/jquery-validation/dist" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /sample/samplemvccore4/samplemvccore4.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netcoreapp3.1 5 | aspnet-samplemvccore4-20314330-701E-46B0-A493-E5980C58E016 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/sample/samplemvccore4/wwwroot/favicon.ico -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/js/site.js: -------------------------------------------------------------------------------- 1 | // Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification 2 | // for details on configuring this project to bundle and minify static web assets. 3 | 4 | // Write your JavaScript code. 5 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/js/src/index.js: -------------------------------------------------------------------------------- 1 | import Alert from './alert' 2 | import Button from './button' 3 | import Carousel from './carousel' 4 | import Collapse from './collapse' 5 | import Dropdown from './dropdown' 6 | import Modal from './modal' 7 | import Popover from './popover' 8 | import Scrollspy from './scrollspy' 9 | import Tab from './tab' 10 | import Toast from './toast' 11 | import Tooltip from './tooltip' 12 | import Util from './util' 13 | 14 | /** 15 | * -------------------------------------------------------------------------- 16 | * Bootstrap (v4.4.1): index.js 17 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 18 | * -------------------------------------------------------------------------- 19 | */ 20 | 21 | export { 22 | Util, 23 | Alert, 24 | Button, 25 | Carousel, 26 | Collapse, 27 | Dropdown, 28 | Modal, 29 | Popover, 30 | Scrollspy, 31 | Tab, 32 | Toast, 33 | Tooltip 34 | } 35 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/js/src/index.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Minified by jsDelivr using Terser v3.14.1. 3 | * Original file: /npm/bootstrap@4.4.1/js/src/index.js 4 | * 5 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 6 | */ 7 | import Alert from"./alert";import Button from"./button";import Carousel from"./carousel";import Collapse from"./collapse";import Dropdown from"./dropdown";import Modal from"./modal";import Popover from"./popover";import Scrollspy from"./scrollspy";import Tab from"./tab";import Toast from"./toast";import Tooltip from"./tooltip";import Util from"./util";export{Util,Alert,Button,Carousel,Collapse,Dropdown,Modal,Popover,Scrollspy,Tab,Toast,Tooltip}; 8 | //# sourceMappingURL=/sm/a1d419f888349ede3e4c47398419e23cc9bc4b73344f14d81c36047212bb1668.map -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/_jumbotron.scss: -------------------------------------------------------------------------------- 1 | .jumbotron { 2 | padding: $jumbotron-padding ($jumbotron-padding / 2); 3 | margin-bottom: $jumbotron-padding; 4 | color: $jumbotron-color; 5 | background-color: $jumbotron-bg; 6 | @include border-radius($border-radius-lg); 7 | 8 | @include media-breakpoint-up(sm) { 9 | padding: ($jumbotron-padding * 2) $jumbotron-padding; 10 | } 11 | } 12 | 13 | .jumbotron-fluid { 14 | padding-right: 0; 15 | padding-left: 0; 16 | @include border-radius(0); 17 | } 18 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/_media.scss: -------------------------------------------------------------------------------- 1 | .media { 2 | display: flex; 3 | align-items: flex-start; 4 | } 5 | 6 | .media-body { 7 | flex: 1; 8 | } 9 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/_root.scss: -------------------------------------------------------------------------------- 1 | // Do not forget to update getting-started/theming.md! 2 | :root { 3 | // Custom variable values only support SassScript inside `#{}`. 4 | @each $color, $value in $colors { 5 | --#{$color}: #{$value}; 6 | } 7 | 8 | @each $color, $value in $theme-colors { 9 | --#{$color}: #{$value}; 10 | } 11 | 12 | @each $bp, $value in $grid-breakpoints { 13 | --breakpoint-#{$bp}: #{$value}; 14 | } 15 | 16 | // Use `inspect` for lists so that quoted items keep the quotes. 17 | // See https://github.com/sass/sass/issues/2383#issuecomment-336349172 18 | --font-family-sans-serif: #{inspect($font-family-sans-serif)}; 19 | --font-family-monospace: #{inspect($font-family-monospace)}; 20 | } 21 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/_transitions.scss: -------------------------------------------------------------------------------- 1 | .fade { 2 | @include transition($transition-fade); 3 | 4 | &:not(.show) { 5 | opacity: 0; 6 | } 7 | } 8 | 9 | .collapse { 10 | &:not(.show) { 11 | display: none; 12 | } 13 | } 14 | 15 | .collapsing { 16 | position: relative; 17 | height: 0; 18 | overflow: hidden; 19 | @include transition($transition-collapse); 20 | } 21 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/_utilities.scss: -------------------------------------------------------------------------------- 1 | @import "utilities/align"; 2 | @import "utilities/background"; 3 | @import "utilities/borders"; 4 | @import "utilities/clearfix"; 5 | @import "utilities/display"; 6 | @import "utilities/embed"; 7 | @import "utilities/flex"; 8 | @import "utilities/float"; 9 | @import "utilities/overflow"; 10 | @import "utilities/position"; 11 | @import "utilities/screenreaders"; 12 | @import "utilities/shadows"; 13 | @import "utilities/sizing"; 14 | @import "utilities/stretched-link"; 15 | @import "utilities/spacing"; 16 | @import "utilities/text"; 17 | @import "utilities/visibility"; 18 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/bootstrap-grid.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grid v4.4.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */ 7 | 8 | html { 9 | box-sizing: border-box; 10 | -ms-overflow-style: scrollbar; 11 | } 12 | 13 | *, 14 | *::before, 15 | *::after { 16 | box-sizing: inherit; 17 | } 18 | 19 | @import "functions"; 20 | @import "variables"; 21 | 22 | @import "mixins/breakpoints"; 23 | @import "mixins/grid-framework"; 24 | @import "mixins/grid"; 25 | 26 | @import "grid"; 27 | @import "utilities/display"; 28 | @import "utilities/flex"; 29 | @import "utilities/spacing"; 30 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/bootstrap-reboot.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.4.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | 9 | @import "functions"; 10 | @import "variables"; 11 | @import "mixins"; 12 | @import "reboot"; 13 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_alert.scss: -------------------------------------------------------------------------------- 1 | @mixin alert-variant($background, $border, $color) { 2 | color: $color; 3 | @include gradient-bg($background); 4 | border-color: $border; 5 | 6 | hr { 7 | border-top-color: darken($border, 5%); 8 | } 9 | 10 | .alert-link { 11 | color: darken($color, 10%); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_background-variant.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Contextual backgrounds 4 | 5 | @mixin bg-variant($parent, $color, $ignore-warning: false) { 6 | #{$parent} { 7 | background-color: $color !important; 8 | } 9 | a#{$parent}, 10 | button#{$parent} { 11 | @include hover-focus() { 12 | background-color: darken($color, 10%) !important; 13 | } 14 | } 15 | @include deprecate("The `bg-variant` mixin", "v4.4.0", "v5", $ignore-warning); 16 | } 17 | 18 | @mixin bg-gradient-variant($parent, $color) { 19 | #{$parent} { 20 | background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_badge.scss: -------------------------------------------------------------------------------- 1 | @mixin badge-variant($bg) { 2 | color: color-yiq($bg); 3 | background-color: $bg; 4 | 5 | @at-root a#{&} { 6 | @include hover-focus() { 7 | color: color-yiq($bg); 8 | background-color: darken($bg, 10%); 9 | } 10 | 11 | &:focus, 12 | &.focus { 13 | outline: 0; 14 | box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_box-shadow.scss: -------------------------------------------------------------------------------- 1 | @mixin box-shadow($shadow...) { 2 | @if $enable-shadows { 3 | $result: (); 4 | 5 | @if (length($shadow) == 1) { 6 | // We can pass `@include box-shadow(none);` 7 | $result: $shadow; 8 | } @else { 9 | // Filter to avoid invalid properties for example `box-shadow: none, 1px 1px black;` 10 | @for $i from 1 through length($shadow) { 11 | @if nth($shadow, $i) != "none" { 12 | $result: append($result, nth($shadow, $i), "comma"); 13 | } 14 | } 15 | } 16 | @if (length($result) > 0) { 17 | box-shadow: $result; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_clearfix.scss: -------------------------------------------------------------------------------- 1 | @mixin clearfix() { 2 | &::after { 3 | display: block; 4 | clear: both; 5 | content: ""; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_deprecate.scss: -------------------------------------------------------------------------------- 1 | // Deprecate mixin 2 | // 3 | // This mixin can be used to deprecate mixins or functions. 4 | // `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to 5 | // some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap) 6 | @mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) { 7 | @if ($enable-deprecation-messages != false and $ignore-warning != true) { 8 | @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}."; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @mixin float-left() { 4 | float: left !important; 5 | @include deprecate("The `float-left` mixin", "v4.3.0", "v5"); 6 | } 7 | @mixin float-right() { 8 | float: right !important; 9 | @include deprecate("The `float-right` mixin", "v4.3.0", "v5"); 10 | } 11 | @mixin float-none() { 12 | float: none !important; 13 | @include deprecate("The `float-none` mixin", "v4.3.0", "v5"); 14 | } 15 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_hover.scss: -------------------------------------------------------------------------------- 1 | // Hover mixin and `$enable-hover-media-query` are deprecated. 2 | // 3 | // Originally added during our alphas and maintained during betas, this mixin was 4 | // designed to prevent `:hover` stickiness on iOS-an issue where hover styles 5 | // would persist after initial touch. 6 | // 7 | // For backward compatibility, we've kept these mixins and updated them to 8 | // always return their regular pseudo-classes instead of a shimmed media query. 9 | // 10 | // Issue: https://github.com/twbs/bootstrap/issues/25195 11 | 12 | @mixin hover() { 13 | &:hover { @content; } 14 | } 15 | 16 | @mixin hover-focus() { 17 | &:hover, 18 | &:focus { 19 | @content; 20 | } 21 | } 22 | 23 | @mixin plain-hover-focus() { 24 | &, 25 | &:hover, 26 | &:focus { 27 | @content; 28 | } 29 | } 30 | 31 | @mixin hover-focus-active() { 32 | &:hover, 33 | &:focus, 34 | &:active { 35 | @content; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_list-group.scss: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | @mixin list-group-item-variant($state, $background, $color) { 4 | .list-group-item-#{$state} { 5 | color: $color; 6 | background-color: $background; 7 | 8 | &.list-group-item-action { 9 | @include hover-focus() { 10 | color: $color; 11 | background-color: darken($background, 5%); 12 | } 13 | 14 | &.active { 15 | color: $white; 16 | background-color: $color; 17 | border-color: $color; 18 | } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_lists.scss: -------------------------------------------------------------------------------- 1 | // Lists 2 | 3 | // Unstyled keeps list items block level, just removes default browser padding and list-style 4 | @mixin list-unstyled() { 5 | padding-left: 0; 6 | list-style: none; 7 | } 8 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_nav-divider.scss: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | @mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y, $ignore-warning: false) { 6 | height: 0; 7 | margin: $margin-y 0; 8 | overflow: hidden; 9 | border-top: 1px solid $color; 10 | @include deprecate("The `nav-divider()` mixin", "v4.4.0", "v5", $ignore-warning); 11 | } 12 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | @mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) { 4 | .page-link { 5 | padding: $padding-y $padding-x; 6 | @include font-size($font-size); 7 | line-height: $line-height; 8 | } 9 | 10 | .page-item { 11 | &:first-child { 12 | .page-link { 13 | @include border-left-radius($border-radius); 14 | } 15 | } 16 | &:last-child { 17 | .page-link { 18 | @include border-right-radius($border-radius); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_reset-text.scss: -------------------------------------------------------------------------------- 1 | @mixin reset-text() { 2 | font-family: $font-family-base; 3 | // We deliberately do NOT reset font-size or word-wrap. 4 | font-style: normal; 5 | font-weight: $font-weight-normal; 6 | line-height: $line-height-base; 7 | text-align: left; // Fallback for where `start` is not supported 8 | text-align: start; 9 | text-decoration: none; 10 | text-shadow: none; 11 | text-transform: none; 12 | letter-spacing: normal; 13 | word-break: normal; 14 | word-spacing: normal; 15 | white-space: normal; 16 | line-break: auto; 17 | } 18 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_resize.scss: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | @mixin resizable($direction) { 4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 5 | resize: $direction; // Options: horizontal, vertical, both 6 | } 7 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Only display content to screen readers 2 | // 3 | // See: https://a11yproject.com/posts/how-to-hide-content/ 4 | // See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/ 5 | 6 | @mixin sr-only() { 7 | position: absolute; 8 | width: 1px; 9 | height: 1px; 10 | padding: 0; 11 | margin: -1px; // Fix for https://github.com/twbs/bootstrap/issues/25686 12 | overflow: hidden; 13 | clip: rect(0, 0, 0, 0); 14 | white-space: nowrap; 15 | border: 0; 16 | } 17 | 18 | // Use in conjunction with .sr-only to only display content when it's focused. 19 | // 20 | // Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 21 | // 22 | // Credit: HTML5 Boilerplate 23 | 24 | @mixin sr-only-focusable() { 25 | &:active, 26 | &:focus { 27 | position: static; 28 | width: auto; 29 | height: auto; 30 | overflow: visible; 31 | clip: auto; 32 | white-space: normal; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_size.scss: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | @mixin size($width, $height: $width) { 4 | width: $width; 5 | height: $height; 6 | @include deprecate("`size()`", "v4.3.0", "v5"); 7 | } 8 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_table-row.scss: -------------------------------------------------------------------------------- 1 | // Tables 2 | 3 | @mixin table-row-variant($state, $background, $border: null) { 4 | // Exact selectors below required to override `.table-striped` and prevent 5 | // inheritance to nested tables. 6 | .table-#{$state} { 7 | &, 8 | > th, 9 | > td { 10 | background-color: $background; 11 | } 12 | 13 | @if $border != null { 14 | th, 15 | td, 16 | thead th, 17 | tbody + tbody { 18 | border-color: $border; 19 | } 20 | } 21 | } 22 | 23 | // Hover states for `.table-hover` 24 | // Note: this is not available for cells or rows within `thead` or `tfoot`. 25 | .table-hover { 26 | $hover-background: darken($background, 5%); 27 | 28 | .table-#{$state} { 29 | @include hover() { 30 | background-color: $hover-background; 31 | 32 | > td, 33 | > th { 34 | background-color: $hover-background; 35 | } 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_text-emphasis.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Typography 4 | 5 | @mixin text-emphasis-variant($parent, $color, $ignore-warning: false) { 6 | #{$parent} { 7 | color: $color !important; 8 | } 9 | @if $emphasized-link-hover-darken-percentage != 0 { 10 | a#{$parent} { 11 | @include hover-focus() { 12 | color: darken($color, $emphasized-link-hover-darken-percentage) !important; 13 | } 14 | } 15 | } 16 | @include deprecate("`text-emphasis-variant()`", "v4.4.0", "v5", $ignore-warning); 17 | } 18 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_text-hide.scss: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | @mixin text-hide($ignore-warning: false) { 3 | // stylelint-disable-next-line font-family-no-missing-generic-family-keyword 4 | font: 0/0 a; 5 | color: transparent; 6 | text-shadow: none; 7 | background-color: transparent; 8 | border: 0; 9 | 10 | @include deprecate("`text-hide()`", "v4.1.0", "v5", $ignore-warning); 11 | } 12 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_text-truncate.scss: -------------------------------------------------------------------------------- 1 | // Text truncate 2 | // Requires inline-block or block for proper styling 3 | 4 | @mixin text-truncate() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_transition.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable property-blacklist 2 | @mixin transition($transition...) { 3 | @if $enable-transitions { 4 | @if length($transition) == 0 { 5 | transition: $transition-base; 6 | } @else { 7 | transition: $transition; 8 | } 9 | } 10 | 11 | @if $enable-prefers-reduced-motion-media-query { 12 | @media (prefers-reduced-motion: reduce) { 13 | transition: none; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/mixins/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Visibility 4 | 5 | @mixin invisible($visibility) { 6 | visibility: $visibility !important; 7 | @include deprecate("`invisible()`", "v4.3.0", "v5"); 8 | } 9 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_align.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .align-baseline { vertical-align: baseline !important; } // Browser default 4 | .align-top { vertical-align: top !important; } 5 | .align-middle { vertical-align: middle !important; } 6 | .align-bottom { vertical-align: bottom !important; } 7 | .align-text-bottom { vertical-align: text-bottom !important; } 8 | .align-text-top { vertical-align: text-top !important; } 9 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_background.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $color, $value in $theme-colors { 4 | @include bg-variant(".bg-#{$color}", $value, true); 5 | } 6 | 7 | @if $enable-gradients { 8 | @each $color, $value in $theme-colors { 9 | @include bg-gradient-variant(".bg-gradient-#{$color}", $value); 10 | } 11 | } 12 | 13 | .bg-white { 14 | background-color: $white !important; 15 | } 16 | 17 | .bg-transparent { 18 | background-color: transparent !important; 19 | } 20 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_clearfix.scss: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | @include clearfix(); 3 | } 4 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_display.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // 4 | // Utilities for common `display` values 5 | // 6 | 7 | @each $breakpoint in map-keys($grid-breakpoints) { 8 | @include media-breakpoint-up($breakpoint) { 9 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 10 | 11 | @each $value in $displays { 12 | .d#{$infix}-#{$value} { display: $value !important; } 13 | } 14 | } 15 | } 16 | 17 | 18 | // 19 | // Utilities for toggling `display` in print 20 | // 21 | 22 | @media print { 23 | @each $value in $displays { 24 | .d-print-#{$value} { display: $value !important; } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_embed.scss: -------------------------------------------------------------------------------- 1 | // Credit: Nicolas Gallagher and SUIT CSS. 2 | 3 | .embed-responsive { 4 | position: relative; 5 | display: block; 6 | width: 100%; 7 | padding: 0; 8 | overflow: hidden; 9 | 10 | &::before { 11 | display: block; 12 | content: ""; 13 | } 14 | 15 | .embed-responsive-item, 16 | iframe, 17 | embed, 18 | object, 19 | video { 20 | position: absolute; 21 | top: 0; 22 | bottom: 0; 23 | left: 0; 24 | width: 100%; 25 | height: 100%; 26 | border: 0; 27 | } 28 | } 29 | 30 | @each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios { 31 | $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1); 32 | $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2); 33 | 34 | .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} { 35 | &::before { 36 | padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $breakpoint in map-keys($grid-breakpoints) { 4 | @include media-breakpoint-up($breakpoint) { 5 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 6 | 7 | .float#{$infix}-left { float: left !important; } 8 | .float#{$infix}-right { float: right !important; } 9 | .float#{$infix}-none { float: none !important; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_overflow.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $value in $overflows { 4 | .overflow-#{$value} { overflow: $value !important; } 5 | } 6 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_position.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Common values 4 | @each $position in $positions { 5 | .position-#{$position} { position: $position !important; } 6 | } 7 | 8 | // Shorthand 9 | 10 | .fixed-top { 11 | position: fixed; 12 | top: 0; 13 | right: 0; 14 | left: 0; 15 | z-index: $zindex-fixed; 16 | } 17 | 18 | .fixed-bottom { 19 | position: fixed; 20 | right: 0; 21 | bottom: 0; 22 | left: 0; 23 | z-index: $zindex-fixed; 24 | } 25 | 26 | .sticky-top { 27 | @supports (position: sticky) { 28 | position: sticky; 29 | top: 0; 30 | z-index: $zindex-sticky; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_screenreaders.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Screenreaders 3 | // 4 | 5 | .sr-only { 6 | @include sr-only(); 7 | } 8 | 9 | .sr-only-focusable { 10 | @include sr-only-focusable(); 11 | } 12 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_shadows.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .shadow-sm { box-shadow: $box-shadow-sm !important; } 4 | .shadow { box-shadow: $box-shadow !important; } 5 | .shadow-lg { box-shadow: $box-shadow-lg !important; } 6 | .shadow-none { box-shadow: none !important; } 7 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_sizing.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Width and height 4 | 5 | @each $prop, $abbrev in (width: w, height: h) { 6 | @each $size, $length in $sizes { 7 | .#{$abbrev}-#{$size} { #{$prop}: $length !important; } 8 | } 9 | } 10 | 11 | .mw-100 { max-width: 100% !important; } 12 | .mh-100 { max-height: 100% !important; } 13 | 14 | // Viewport additional helpers 15 | 16 | .min-vw-100 { min-width: 100vw !important; } 17 | .min-vh-100 { min-height: 100vh !important; } 18 | 19 | .vw-100 { width: 100vw !important; } 20 | .vh-100 { height: 100vh !important; } 21 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_stretched-link.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Stretched link 3 | // 4 | 5 | .stretched-link { 6 | &::after { 7 | position: absolute; 8 | top: 0; 9 | right: 0; 10 | bottom: 0; 11 | left: 0; 12 | z-index: 1; 13 | // Just in case `pointer-events: none` is set on a parent 14 | pointer-events: auto; 15 | content: ""; 16 | // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color 17 | background-color: rgba(0, 0, 0, 0); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/bootstrap/scss/utilities/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // 4 | // Visibility utilities 5 | // 6 | 7 | .visible { 8 | visibility: visible !important; 9 | } 10 | 11 | .invisible { 12 | visibility: hidden !important; 13 | } 14 | -------------------------------------------------------------------------------- /sample/samplemvccore4/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) .NET Foundation. All rights reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use 4 | these files except in compliance with the License. You may obtain a copy of the 5 | License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software distributed 10 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 11 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 12 | specific language governing permissions and limitations under the License. 13 | -------------------------------------------------------------------------------- /src/ElCamino.AspNetCore.Identity.AzureTable.Model/IGenerateKeys.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | 3 | namespace ElCamino.AspNetCore.Identity.AzureTable.Model 4 | { 5 | /// 6 | /// Generates keys suitable for table storage 7 | /// 8 | public interface IGenerateKeys 9 | { 10 | /// 11 | /// Accept the keyhelper to generate keys for an entity 12 | /// 13 | /// 14 | void GenerateKeys(IKeyHelper keyHelper); 15 | 16 | /// 17 | /// Returns the rowkey for the entity without setting it 18 | /// 19 | /// 20 | /// 21 | string PeekRowKey(IKeyHelper keyHelper); 22 | 23 | /// 24 | /// Key Version for the entity 25 | /// 26 | double KeyVersion { get; set; } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/ElCamino.AspNetCore.Identity.AzureTable.Model/IdentityConfiguration.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | 3 | 4 | namespace ElCamino.AspNetCore.Identity.AzureTable.Model 5 | { 6 | /// 7 | /// Table Storage Configuration 8 | /// 9 | public class IdentityConfiguration 10 | { 11 | /// 12 | /// Optional field, prefixes all given table names 13 | /// 14 | public string? TablePrefix { get; set; } 15 | 16 | /// 17 | /// Optional, default value is AspNetIndex 18 | /// 19 | public string? IndexTableName { get; set; } 20 | 21 | /// 22 | /// Optional, default value is AspNetUsers 23 | /// 24 | public string? UserTableName { get; set; } 25 | 26 | /// 27 | /// Optional, default value is AspNetRoles 28 | /// 29 | public string? RoleTableName { get; set; } 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/ElCamino.AspNetCore.Identity.AzureTable.Model/README.md: -------------------------------------------------------------------------------- 1 | ElCamino.AspNetCore.Identity.AzureTable.Model 2 | ================== 3 | 4 | This project provides the ASP.NET Identity Core models for the ElCamino.AspNetCore.Identity.AzureTable package that uses Azure Table storage instead of the Entity Framework / MSSQL data provider. 5 | 6 | [![Build Status](https://dev.azure.com/elcamino/Azure%20OpenSource/_apis/build/status%2Fdlmelendez.identityazuretable?branchName=master)](https://dev.azure.com/elcamino/Azure%20OpenSource/_build/latest?definitionId=18&branchName=master) 7 | [![NuGet Version](https://img.shields.io/nuget/v/ElCamino.AspNetCore.Identity.AzureTable.Model)](https://www.nuget.org/packages/ElCamino.AspNetCore.Identity.AzureTable.Model/) 8 | 9 | Project site at https://elcamino.cloud/projects/docs/identityazuretable/. 10 | -------------------------------------------------------------------------------- /src/ElCamino.AspNetCore.Identity.AzureTable.Model/projectNugetPic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/src/ElCamino.AspNetCore.Identity.AzureTable.Model/projectNugetPic.png -------------------------------------------------------------------------------- /src/ElCamino.AspNetCore.Identity.AzureTable/projectNugetPic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/src/ElCamino.AspNetCore.Identity.AzureTable/projectNugetPic.png -------------------------------------------------------------------------------- /src/ElCamino.Azure.Data.Tables/README.md: -------------------------------------------------------------------------------- 1 | ElCamino.Azure.Data.Tables 2 | ================== 3 | 4 | Azure Table Storage odata query building and operators from the older Azure Storage SDKs and some other async, mapping, and batch helpers and/or extensions. 5 | 6 | [![Build Status](https://dev.azure.com/elcamino/Azure%20OpenSource/_apis/build/status/IdentityAzureTableCore?branchName=master)](https://dev.azure.com/elcamino/Azure%20OpenSource/_build/latest?definitionId=4&branchName=master) 7 | [![NuGet Version](https://img.shields.io/nuget/v/ElCamino.Azure.Data.Tables)](https://www.nuget.org/packages/ElCamino.Azure.Data.Tables/) 8 | 9 | Project site at https://dlmelendez.github.io/identityazuretable/. 10 | -------------------------------------------------------------------------------- /src/ElCamino.Azure.Data.Tables/projectNugetPic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/src/ElCamino.Azure.Data.Tables/projectNugetPic.png -------------------------------------------------------------------------------- /src/ElCamino.Identity.AzureTable.DataUtility/IMigration.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | 3 | using System; 4 | using System.Collections.Generic; 5 | using Azure.Data.Tables; 6 | using ElCamino.AspNetCore.Identity.AzureTable; 7 | 8 | namespace ElCamino.Identity.AzureTable.DataUtility 9 | { 10 | public interface IMigration 11 | { 12 | TableQuery GetSourceTableQuery(); 13 | 14 | bool UserWhereFilter(TableEntity d); 15 | 16 | void ProcessMigrate(IdentityCloudContext targetContext, 17 | IdentityCloudContext sourceContext, 18 | IList sourceUserResults, 19 | int maxDegreesParallel, 20 | Action? updateComplete = null, 21 | Action? updateError = null); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/ElCamino.Identity.AzureTable.DataUtility/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyConfiguration("")] 8 | [assembly: AssemblyCompany("")] 9 | [assembly: AssemblyProduct("ElCamino.Identity.AzureTable.DataUtility")] 10 | [assembly: AssemblyTrademark("")] 11 | 12 | // Setting ComVisible to false makes the types in this assembly not visible 13 | // to COM components. If you need to access a type in this assembly from 14 | // COM, set the ComVisible attribute to true on that type. 15 | [assembly: ComVisible(false)] 16 | 17 | // The following GUID is for the ID of the typelib if this project is exposed to COM 18 | [assembly: Guid("56bb5104-e5f7-49bd-a5e9-25b818197f28")] 19 | -------------------------------------------------------------------------------- /src/ElCamino.Identity.AzureTable.DataUtility/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:1878/", 7 | "sslPort": 0 8 | } 9 | }, 10 | "profiles": { 11 | "ElCamino.Identity.AzureTable.DataUtility": { 12 | "commandName": "Project", 13 | "commandLineArgs": "/migrate:users" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/ElCamino.Identity.AzureTable.DataUtility/TableEntityExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace Azure.Data.Tables 2 | { 3 | public static class TableEntityExtensions 4 | { 5 | public static void ResetKeys(this TableEntity entity, string partitionKey, string rowKey, ETag eTag = default) 6 | { 7 | if (eTag == default) 8 | { 9 | eTag = ETag.All; 10 | } 11 | entity.PartitionKey = partitionKey; 12 | entity.RowKey = rowKey; 13 | entity.ETag = eTag; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/ElCamino.Identity.AzureTable.DataUtility/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "source": { 3 | "IdentityConfiguration": { 4 | "TablePrefix": "src", 5 | "StorageConnectionString": "UseDevelopmentStorage=true;", 6 | "LocationMode": "PrimaryOnly", 7 | "UserTableName": "", 8 | "IndexTableName": "", 9 | "RoleTableName": "" 10 | } 11 | }, 12 | "target": { 13 | "IdentityConfiguration": { 14 | "TablePrefix": "tgt", 15 | "StorageConnectionString": "UseDevelopmentStorage=true;", 16 | "LocationMode": "PrimaryOnly", 17 | "UserTableName": "", 18 | "IndexTableName": "", 19 | "RoleTableName": "" 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/.template.config/template.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/template", 3 | "author": "David Melendez", 4 | "classifications": [ "Web", "MVC" ], 5 | "name": "ASP.NET Core MVC Web App/Identity Azure Tables ", 6 | "identity": "ElCamino.AspNetCore.Identity.AzureTable.Web.Mvc.Template", 7 | "shortName": "mvc-id-azure-tables", 8 | "tags": { 9 | "language": "C#", 10 | "type": "project" 11 | }, 12 | "sourceName": "samplemvccore", 13 | "preferNameDirectory": false 14 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Areas/Identity/Pages/Account/Manage/ShowRecoveryCodes.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Identity; 6 | using Microsoft.AspNetCore.Mvc; 7 | using Microsoft.AspNetCore.Mvc.RazorPages; 8 | using Microsoft.Extensions.Logging; 9 | 10 | namespace samplemvccore5.Areas.Identity.Pages.Account.Manage 11 | { 12 | public class ShowRecoveryCodesModel : PageModel 13 | { 14 | [TempData] 15 | public string[] RecoveryCodes { get; set; } 16 | 17 | [TempData] 18 | public string StatusMessage { get; set; } 19 | 20 | public IActionResult OnGet() 21 | { 22 | if (RecoveryCodes == null || RecoveryCodes.Length == 0) 23 | { 24 | return RedirectToPage("./TwoFactorAuthentication"); 25 | } 26 | 27 | return Page(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore.Areas.Identity.Pages.Account.Manage 2 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser; -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Areas/Identity/Pages/Account/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore.Areas.Identity.Pages.Account 2 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser; -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Areas/Identity/Pages/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @using samplemvccore.Areas.Identity 3 | @using samplemvccore.Areas.Identity.Pages 4 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser; 5 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 6 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Controllers/HomeController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using samplemvccore.Models; 3 | using System.Diagnostics; 4 | 5 | namespace samplemvccore.Controllers 6 | { 7 | public class HomeController : Controller 8 | { 9 | private readonly ILogger _logger; 10 | 11 | public HomeController(ILogger logger) 12 | { 13 | _logger = logger; 14 | } 15 | 16 | public IActionResult Index() 17 | { 18 | return View(); 19 | } 20 | 21 | public IActionResult Privacy() 22 | { 23 | return View(); 24 | } 25 | 26 | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 27 | public IActionResult Error() 28 | { 29 | return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Data/ApplicationDbContext.cs: -------------------------------------------------------------------------------- 1 | using ElCamino.AspNetCore.Identity.AzureTable; 2 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 3 | 4 | namespace samplemvccore.Data 5 | { 6 | public class ApplicationDbContext : IdentityCloudContext 7 | { 8 | public ApplicationDbContext(IdentityConfiguration config) : base(config) 9 | { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Models/ErrorViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace samplemvccore.Models 2 | { 3 | public class ErrorViewModel 4 | { 5 | public string? RequestId { get; set; } 6 | 7 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 8 | } 9 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:28092", 7 | "sslPort": 44341 8 | } 9 | }, 10 | "profiles": { 11 | "samplemvccore": { 12 | "commandName": "Project", 13 | "dotnetRunMessages": true, 14 | "launchBrowser": true, 15 | "applicationUrl": "https://localhost:7125;http://localhost:5125", 16 | "environmentVariables": { 17 | "ASPNETCORE_ENVIRONMENT": "Development" 18 | } 19 | }, 20 | "IIS Express": { 21 | "commandName": "IISExpress", 22 | "launchBrowser": true, 23 | "environmentVariables": { 24 | "ASPNETCORE_ENVIRONMENT": "Development" 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/ScaffoldingReadMe.txt: -------------------------------------------------------------------------------- 1 | Support for ASP.NET Core Identity was added to your project. 2 | 3 | For setup and configuration information, see https://go.microsoft.com/fwlink/?linkid=2116645. 4 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Views/Home/Index.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Home Page"; 3 | } 4 | 5 |
6 |

Welcome

7 |

Learn about building Web apps with ASP.NET Core.

8 |
9 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Views/Home/Privacy.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Privacy Policy"; 3 | } 4 |

@ViewData["Title"]

5 | 6 |

Use this page to detail your site's privacy policy.

7 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Views/Shared/Error.cshtml: -------------------------------------------------------------------------------- 1 | @model ErrorViewModel 2 | @{ 3 | ViewData["Title"] = "Error"; 4 | } 5 | 6 |

Error.

7 |

An error occurred while processing your request.

8 | 9 | @if (Model?.ShowRequestId ?? false) 10 | { 11 |

12 | Request ID: @Model?.RequestId 13 |

14 | } 15 | 16 |

Development Mode

17 |

18 | Swapping to Development environment will display more detailed information about the error that occurred. 19 |

20 |

21 | The Development environment shouldn't be enabled for deployed applications. 22 | It can result in displaying sensitive information from exceptions to end users. 23 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 24 | and restarting the app. 25 |

26 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Views/Shared/_Layout.cshtml.css: -------------------------------------------------------------------------------- 1 | /* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification 2 | for details on configuring this project to bundle and minify static web assets. */ 3 | 4 | a.navbar-brand { 5 | white-space: normal; 6 | text-align: center; 7 | word-break: break-all; 8 | } 9 | 10 | a { 11 | color: #0077cc; 12 | } 13 | 14 | .btn-primary { 15 | color: #fff; 16 | background-color: #1b6ec2; 17 | border-color: #1861ac; 18 | } 19 | 20 | .nav-pills .nav-link.active, .nav-pills .show > .nav-link { 21 | color: #fff; 22 | background-color: #1b6ec2; 23 | border-color: #1861ac; 24 | } 25 | 26 | .border-top { 27 | border-top: 1px solid #e5e5e5; 28 | } 29 | .border-bottom { 30 | border-bottom: 1px solid #e5e5e5; 31 | } 32 | 33 | .box-shadow { 34 | box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); 35 | } 36 | 37 | button.accept-policy { 38 | font-size: 1rem; 39 | line-height: inherit; 40 | } 41 | 42 | .footer { 43 | position: absolute; 44 | bottom: 0; 45 | width: 100%; 46 | white-space: nowrap; 47 | line-height: 60px; 48 | } 49 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Views/Shared/_LoginPartial.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @inject SignInManager SignInManager 3 | @inject UserManager UserManager 4 | 5 | 27 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Views/Shared/_ValidationScriptsPartial.cshtml: -------------------------------------------------------------------------------- 1 |  2 | 3 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplemvccore 2 | @using samplemvccore.Models 3 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser; 4 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 5 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "IdentityAzureTable": { 3 | "IdentityConfiguration": { 4 | "TablePrefix": "v7", 5 | "StorageConnectionString": "UseDevelopmentStorage=true;", 6 | "IndexTableName": "AspNetIndex", 7 | "RoleTableName": "AspNetRoles", 8 | "UserTableName": "AspNetUsers" 9 | } 10 | }, 11 | "Logging": { 12 | "LogLevel": { 13 | "Default": "Information", 14 | "Microsoft.AspNetCore": "Warning" 15 | } 16 | }, 17 | "AllowedHosts": "*" 18 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/samplemvccore.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | enable 6 | enable 7 | aspnet-samplemvccore-FECFB455-D41D-47DD-B371-2C0F71AC101F 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/wwwroot/css/site.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 14px; 3 | } 4 | 5 | @media (min-width: 768px) { 6 | html { 7 | font-size: 16px; 8 | } 9 | } 10 | 11 | html { 12 | position: relative; 13 | min-height: 100%; 14 | } 15 | 16 | body { 17 | margin-bottom: 60px; 18 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/templates/templates/StarterWebMvc-CSharp/wwwroot/favicon.ico -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/wwwroot/js/site.js: -------------------------------------------------------------------------------- 1 | // Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification 2 | // for details on configuring this project to bundle and minify static web assets. 3 | 4 | // Write your JavaScript code. 5 | -------------------------------------------------------------------------------- /templates/templates/StarterWebMvc-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) .NET Foundation. All rights reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use 4 | these files except in compliance with the License. You may obtain a copy of the 5 | License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software distributed 10 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 11 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 12 | specific language governing permissions and limitations under the License. 13 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/.template.config/template.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/template", 3 | "author": "David Melendez", 4 | "classifications": [ "Web", "Razor Pages" ], 5 | "name": "ASP.NET Core Razor Pages Web App/Identity Azure Tables ", 6 | "identity": "ElCamino.AspNetCore.Identity.AzureTable.Web.RazorPages.Template", 7 | "shortName": "rzp-id-azure-tables", 8 | "tags": { 9 | "language": "C#", 10 | "type": "project" 11 | }, 12 | "sourceName": "samplerazorpagescore", 13 | "preferNameDirectory": false 14 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplerazorpagescore.Areas.Identity.Pages.Account.Manage -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Areas/Identity/Pages/Account/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using samplerazorpagescore.Areas.Identity.Pages.Account 2 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser; 3 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Areas/Identity/Pages/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @using samplerazorpagescore.Areas.Identity 3 | @using samplerazorpagescore.Areas.Identity.Pages 4 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser; 5 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 6 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Data/ApplicationDbContext.cs: -------------------------------------------------------------------------------- 1 | using ElCamino.AspNetCore.Identity.AzureTable; 2 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 3 | 4 | namespace samplerazorpagescore.Data 5 | { 6 | public class ApplicationDbContext : IdentityCloudContext 7 | { 8 | public ApplicationDbContext(IdentityConfiguration config) : base(config) 9 | { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/Error.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model ErrorModel 3 | @{ 4 | ViewData["Title"] = "Error"; 5 | } 6 | 7 |

Error.

8 |

An error occurred while processing your request.

9 | 10 | @if (Model.ShowRequestId) 11 | { 12 |

13 | Request ID: @Model.RequestId 14 |

15 | } 16 | 17 |

Development Mode

18 |

19 | Swapping to the Development environment displays detailed information about the error that occurred. 20 |

21 |

22 | The Development environment shouldn't be enabled for deployed applications. 23 | It can result in displaying sensitive information from exceptions to end users. 24 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 25 | and restarting the app. 26 |

27 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/Error.cshtml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using Microsoft.AspNetCore.Mvc.RazorPages; 3 | using System.Diagnostics; 4 | 5 | namespace samplerazorpagescore.Pages 6 | { 7 | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 8 | [IgnoreAntiforgeryToken] 9 | public class ErrorModel : PageModel 10 | { 11 | public string? RequestId { get; set; } 12 | 13 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 14 | 15 | private readonly ILogger _logger; 16 | 17 | public ErrorModel(ILogger logger) 18 | { 19 | _logger = logger; 20 | } 21 | 22 | public void OnGet() 23 | { 24 | RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/Index.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model IndexModel 3 | @{ 4 | ViewData["Title"] = "Home page"; 5 | } 6 | 7 |
8 |

Welcome

9 |

Learn about building Web apps with ASP.NET Core.

10 |
11 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/Index.cshtml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using Microsoft.AspNetCore.Mvc.RazorPages; 3 | 4 | namespace samplerazorpagescore.Pages 5 | { 6 | public class IndexModel : PageModel 7 | { 8 | private readonly ILogger _logger; 9 | 10 | public IndexModel(ILogger logger) 11 | { 12 | _logger = logger; 13 | } 14 | 15 | public void OnGet() 16 | { 17 | 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/Privacy.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model PrivacyModel 3 | @{ 4 | ViewData["Title"] = "Privacy Policy"; 5 | } 6 |

@ViewData["Title"]

7 | 8 |

Use this page to detail your site's privacy policy.

9 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/Privacy.cshtml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using Microsoft.AspNetCore.Mvc.RazorPages; 3 | 4 | namespace samplerazorpagescore.Pages 5 | { 6 | public class PrivacyModel : PageModel 7 | { 8 | private readonly ILogger _logger; 9 | 10 | public PrivacyModel(ILogger logger) 11 | { 12 | _logger = logger; 13 | } 14 | 15 | public void OnGet() 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/Shared/_Layout.cshtml.css: -------------------------------------------------------------------------------- 1 | /* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification 2 | for details on configuring this project to bundle and minify static web assets. */ 3 | 4 | a.navbar-brand { 5 | white-space: normal; 6 | text-align: center; 7 | word-break: break-all; 8 | } 9 | 10 | a { 11 | color: #0077cc; 12 | } 13 | 14 | .btn-primary { 15 | color: #fff; 16 | background-color: #1b6ec2; 17 | border-color: #1861ac; 18 | } 19 | 20 | .nav-pills .nav-link.active, .nav-pills .show > .nav-link { 21 | color: #fff; 22 | background-color: #1b6ec2; 23 | border-color: #1861ac; 24 | } 25 | 26 | .border-top { 27 | border-top: 1px solid #e5e5e5; 28 | } 29 | .border-bottom { 30 | border-bottom: 1px solid #e5e5e5; 31 | } 32 | 33 | .box-shadow { 34 | box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); 35 | } 36 | 37 | button.accept-policy { 38 | font-size: 1rem; 39 | line-height: inherit; 40 | } 41 | 42 | .footer { 43 | position: absolute; 44 | bottom: 0; 45 | width: 100%; 46 | white-space: nowrap; 47 | line-height: 60px; 48 | } 49 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/Shared/_LoginPartial.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @inject SignInManager SignInManager 3 | @inject UserManager UserManager 4 | 5 | 27 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/Shared/_ValidationScriptsPartial.cshtml: -------------------------------------------------------------------------------- 1 |  2 | 3 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @using samplerazorpagescore 3 | @using samplerazorpagescore.Data 4 | @using IdentityUser = ElCamino.AspNetCore.Identity.AzureTable.Model.IdentityUser; 5 | @namespace samplerazorpagescore.Pages 6 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 7 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Pages/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:16374", 7 | "sslPort": 44323 8 | } 9 | }, 10 | "profiles": { 11 | "samplerazorpagescore": { 12 | "commandName": "Project", 13 | "dotnetRunMessages": true, 14 | "launchBrowser": true, 15 | "applicationUrl": "https://localhost:7071;http://localhost:5120", 16 | "environmentVariables": { 17 | "ASPNETCORE_ENVIRONMENT": "Development" 18 | } 19 | }, 20 | "IIS Express": { 21 | "commandName": "IISExpress", 22 | "launchBrowser": true, 23 | "environmentVariables": { 24 | "ASPNETCORE_ENVIRONMENT": "Development" 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/ScaffoldingReadMe.txt: -------------------------------------------------------------------------------- 1 | Support for ASP.NET Core Identity was added to your project. 2 | 3 | For setup and configuration information, see https://go.microsoft.com/fwlink/?linkid=2116645. 4 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "DetailedErrors": true, 3 | "Logging": { 4 | "LogLevel": { 5 | "Default": "Information", 6 | "Microsoft.AspNetCore": "Warning" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "IdentityAzureTable": { 3 | "IdentityConfiguration": { 4 | "TablePrefix": "v7", 5 | "StorageConnectionString": "UseDevelopmentStorage=true;", 6 | "IndexTableName": "AspNetIndex", 7 | "RoleTableName": "AspNetRoles", 8 | "UserTableName": "AspNetUsers" 9 | } 10 | }, 11 | "Logging": { 12 | "LogLevel": { 13 | "Default": "Information", 14 | "Microsoft.AspNetCore": "Warning" 15 | } 16 | }, 17 | "AllowedHosts": "*" 18 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/samplerazorpagescore.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net7.0 5 | enable 6 | enable 7 | aspnet-samplerazorpagescore-9339924A-3037-4518-866A-C28CC554EA47 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/wwwroot/css/site.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 14px; 3 | } 4 | 5 | @media (min-width: 768px) { 6 | html { 7 | font-size: 16px; 8 | } 9 | } 10 | 11 | html { 12 | position: relative; 13 | min-height: 100%; 14 | } 15 | 16 | body { 17 | margin-bottom: 60px; 18 | } -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/templates/templates/StarterWebRazorPages-CSharp/wwwroot/favicon.ico -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/wwwroot/js/site.js: -------------------------------------------------------------------------------- 1 | // Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification 2 | // for details on configuring this project to bundle and minify static web assets. 3 | 4 | // Write your JavaScript code. 5 | -------------------------------------------------------------------------------- /templates/templates/StarterWebRazorPages-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) .NET Foundation. All rights reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use 4 | these files except in compliance with the License. You may obtain a copy of the 5 | License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software distributed 10 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 11 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 12 | specific language governing permissions and limitations under the License. 13 | -------------------------------------------------------------------------------- /tests/ElCamino.AspNetCore.Identity.AzureTable.Tests/ExceptionHelper.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | using System; 3 | 4 | namespace ElCamino.AspNetCore.Identity.AzureTable.Tests 5 | { 6 | public static class ExceptionHelper 7 | { 8 | public static void ValidateAggregateException(this AggregateException agg) where T : Exception, new() 9 | { 10 | try 11 | { 12 | if (agg.InnerExceptions[0] is T) 13 | { 14 | return; 15 | } 16 | } 17 | catch 18 | { 19 | throw agg; 20 | } 21 | 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /tests/ElCamino.AspNetCore.Identity.AzureTable.Tests/ModelTests/ApplicationUser.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | 3 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 4 | 5 | namespace ElCamino.Web.Identity.AzureTable.Tests.ModelTests 6 | { 7 | public class ApplicationUserV2 : IdentityUser, IApplicationUser 8 | { 9 | public string FirstName { get; set; } 10 | 11 | public string LastName { get; set; } 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /tests/ElCamino.AspNetCore.Identity.AzureTable.Tests/ModelTests/IApplicationUser.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | 3 | namespace ElCamino.Web.Identity.AzureTable.Tests.ModelTests 4 | { 5 | public interface IApplicationUser 6 | { 7 | string FirstName { get; set; } 8 | string LastName { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /tests/ElCamino.AspNetCore.Identity.AzureTable.Tests/ModelTests/IdentityRoleTests.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | 3 | using System; 4 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 5 | using Xunit; 6 | 7 | namespace ElCamino.AspNetCore.Identity.AzureTable.Tests.ModelTests 8 | { 9 | public class IdentityRoleTests 10 | { 11 | [Fact(DisplayName = "IdentityRoleSet_Id")] 12 | [Trait("IdentityCore.Azure.Model", "")] 13 | public void IdentityRoleSet_Id() 14 | { 15 | var role = new IdentityRole(); 16 | role.Id = Guid.NewGuid().ToString(); 17 | Assert.Equal(role.RowKey, role.Id); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/ElCamino.AspNetCore.Identity.AzureTable.Tests/ModelTests/IdentityUserClaimTests.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | 3 | using ElCamino.AspNetCore.Identity.AzureTable.Helpers; 4 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 5 | using Xunit; 6 | 7 | namespace ElCamino.AspNetCore.Identity.AzureTable.Tests.ModelTests 8 | { 9 | public class IdentityUserClaimTests 10 | { 11 | [Fact(DisplayName = "IdentityUserClaimGet_UserId")] 12 | [Trait("IdentityCore.Azure.Model", "")] 13 | public void IdentityUserClaimGet_UserId() 14 | { 15 | var uc = new IdentityUserClaim(); 16 | uc.GenerateKeys(new DefaultKeyHelper()); 17 | 18 | var uc2 = new IdentityUserClaim(); 19 | uc2.GenerateKeys(new SHA256KeyHelper()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tests/ElCamino.AspNetCore.Identity.AzureTable.Tests/ModelTests/IdentityUserRoleTests.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | 3 | using ElCamino.AspNetCore.Identity.AzureTable.Helpers; 4 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 5 | using Xunit; 6 | 7 | namespace ElCamino.AspNetCore.Identity.AzureTable.Tests.ModelTests 8 | { 9 | public class IdentityUserRoleTests 10 | { 11 | [Fact(DisplayName = "IdentityUserRoleGet_UserId")] 12 | [Trait("IdentityCore.Azure.Model", "")] 13 | public void IdentityUserRoleGet_UserId() 14 | { 15 | var ur = new IdentityUserRole(); 16 | ur.GenerateKeys(new DefaultKeyHelper()); 17 | Assert.Null(ur.UserId); 18 | Assert.Equal(string.Empty, ur.PartitionKey); 19 | 20 | var ur2 = new IdentityUserRole(); 21 | ur2.GenerateKeys(new SHA256KeyHelper()); 22 | Assert.Null(ur2.UserId); 23 | Assert.Equal(string.Empty, ur2.PartitionKey); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tests/ElCamino.AspNetCore.Identity.AzureTable.Tests/ModelTests/IdentityUserTests.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | using System; 3 | using ElCamino.AspNetCore.Identity.AzureTable.Model; 4 | using Xunit; 5 | 6 | namespace ElCamino.AspNetCore.Identity.AzureTable.Tests.ModelTests 7 | { 8 | public class IdentityUserTests 9 | { 10 | [Fact(DisplayName = "IdentityUserCtors")] 11 | [Trait("IdentityCore.Azure.Model", "")] 12 | public void IdentityUserCtors() 13 | { 14 | Assert.NotNull(new IdentityUser(Guid.NewGuid().ToString())); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tests/ElCamino.AspNetCore.Identity.AzureTable.Tests/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "AppSettings": { 3 | "SiteTitle": "SampleMvc2" 4 | }, 5 | "Data": { 6 | "DefaultConnection": { 7 | "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnet5-SampleMvc2-444042c2-53c3-4c2b-ae65-5c753b0d2e4a;Trusted_Connection=True;MultipleActiveResultSets=true" 8 | } 9 | }, 10 | "IdentityAzureTable": { 11 | "identityConfiguration": { 12 | "tablePrefix": "av62", 13 | "indexTableName": "indexes", 14 | "userTableName": "users", 15 | "roleTableName": "roles", 16 | "storageConnectionString": "UseDevelopmentStorage=true;", 17 | "locationMode": "PrimaryOnly" 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/ElCamino.Azure.Data.Tables.Tests/BaseTest.cs: -------------------------------------------------------------------------------- 1 | // MIT License Copyright 2020 (c) David Melendez. All rights reserved. See License.txt in the project root for license information. 2 | using Azure.Data.Tables; 3 | using Xunit; 4 | using Xunit.Abstractions; 5 | 6 | namespace ElCamino.Azure.Data.Tables.Tests 7 | { 8 | public class BaseTest : IClassFixture 9 | { 10 | protected readonly ITestOutputHelper _output; 11 | protected readonly TableFixture _tableFixture; 12 | protected readonly TableServiceClient _tableServiceClient; 13 | protected const string TableName = "aatabletests"; 14 | protected readonly TableClient _tableClient; 15 | 16 | public BaseTest(TableFixture tableFixture, ITestOutputHelper output) 17 | { 18 | _output = output; 19 | _tableFixture = tableFixture; 20 | _tableServiceClient = _tableFixture.TableService; 21 | _tableClient = _tableServiceClient.GetTableClient(TableName); 22 | } 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/ElCamino.Azure.Data.Tables.Tests/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "ElCamino": { 3 | "storageConnectionString": "UseDevelopmentStorage=true;" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /tools/key.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dlmelendez/identityazuretable/61147249318200729439d4af8fc84daaa82a5258/tools/key.snk --------------------------------------------------------------------------------