diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11.sln b/samples/basic.WebApp.Core11/basic.WebApp.Core11.sln new file mode 100644 index 0000000..3188aff --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26403.7 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "basic.WebApp.Core11", "basic.WebApp.Core11\basic.WebApp.Core11.csproj", "{8F776E38-C5E0-4C75-9A40-4127113B1A46}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8F776E38-C5E0-4C75-9A40-4127113B1A46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F776E38-C5E0-4C75-9A40-4127113B1A46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F776E38-C5E0-4C75-9A40-4127113B1A46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F776E38-C5E0-4C75-9A40-4127113B1A46}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/.bowerrc b/samples/basic.WebApp.Core11/basic.WebApp.Core11/.bowerrc new file mode 100644 index 0000000..6406626 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "wwwroot/lib" +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Controllers/HomeController.cs b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Controllers/HomeController.cs new file mode 100644 index 0000000..8976aed --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Controllers/HomeController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Mvc; + +namespace basic.WebApp.Core11.Controllers +{ + public class HomeController : Controller + { + public IActionResult Index() + { + return View(); + } + + public IActionResult About() + { + ViewData["Message"] = "Your application description page."; + + return View(); + } + + public IActionResult Contact() + { + ViewData["Message"] = "Your contact page."; + + return View(); + } + + public IActionResult Error() + { + return View(); + } + } +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Program.cs b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Program.cs new file mode 100644 index 0000000..56b5994 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Program.cs @@ -0,0 +1,21 @@ +using System.IO; +using Microsoft.AspNetCore.Hosting; + +namespace basic.WebApp.Core11 +{ + public class Program + { + public static void Main(string[] args) + { + var host = new WebHostBuilder() + .UseKestrel() + .UseContentRoot(Directory.GetCurrentDirectory()) + .UseIISIntegration() + .UseStartup() + .UseApplicationInsights() + .Build(); + + host.Run(); + } + } +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Properties/launchSettings.json b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Properties/launchSettings.json new file mode 100644 index 0000000..7563bef --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:56048/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "basic.WebApp.Core11": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:56049" + } + } +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Startup.cs b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Startup.cs new file mode 100644 index 0000000..8e097a3 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Startup.cs @@ -0,0 +1,100 @@ +using System.Collections.Generic; +using cloudscribe.Web.SimpleAuth.Models; +using cloudscribe.Web.SimpleAuth.Services; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace basic.WebApp.Core11 +{ + public class Startup + { + public Startup(IHostingEnvironment env) + { + var builder = new ConfigurationBuilder() + .SetBasePath(env.ContentRootPath) + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) + .AddEnvironmentVariables(); + + // you can use whatever file name you like and it is probably a good idea to use a custom file name + // just an a small extra protection in case hackers try some kind of attack based on knowing the name of the file + // it should not be possible for anyone to get files outside of wwwroot using http requests + // but every little thing you can do for stronger security is a good idea + builder.AddJsonFile("simpleauthsettings.json", optional: true); + + if (env.IsDevelopment()) + { + // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709 + builder.AddUserSecrets(); + } + + builder.AddEnvironmentVariables(); + + Configuration = builder.Build(); + } + + public IConfigurationRoot Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.Configure(Configuration.GetSection("SimpleAuthSettings")); + services.Configure>(Configuration.GetSection("Users")); + services.AddScoped, PasswordHasher>(); + services.AddScoped(); + services.AddScoped(); // single tenant + services.AddScoped(); + + + services.AddMvc(); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions authSettingsAccessor) + { + loggerFactory.AddConsole(Configuration.GetSection("Logging")); + loggerFactory.AddDebug(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + app.UseBrowserLink(); + } + else + { + app.UseExceptionHandler("/Home/Error"); + } + + app.UseStaticFiles(); + + // Add cookie-based authentication to the request pipeline + + SimpleAuthSettings authSettings = authSettingsAccessor.Value; + + var ApplicationCookie = new CookieAuthenticationOptions + { + AuthenticationScheme = authSettings.AuthenticationScheme, + CookieName = authSettings.AuthenticationScheme, + AutomaticAuthenticate = true, + AutomaticChallenge = true, + LoginPath = new PathString("/Login/Index") + + }; + + app.UseCookieAuthentication(ApplicationCookie); + + app.UseMvc(routes => + { + routes.MapRoute( + name: "default", + template: "{controller=Home}/{action=Index}/{id?}"); + }); + } + } +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Home/About.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Home/About.cshtml new file mode 100644 index 0000000..50476d1 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Home/About.cshtml @@ -0,0 +1,7 @@ +@{ + ViewData["Title"] = "About"; +} +

@ViewData["Title"].

+

@ViewData["Message"]

+ +

Use this area to provide additional information.

diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Home/Contact.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Home/Contact.cshtml new file mode 100644 index 0000000..15c12c6 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Home/Contact.cshtml @@ -0,0 +1,17 @@ +@{ + ViewData["Title"] = "Contact"; +} +

@ViewData["Title"].

+

@ViewData["Message"]

+ +
+ One Microsoft Way
+ Redmond, WA 98052-6399
+ P: + 425.555.0100 +
+ +
+ Support: Support@example.com
+ Marketing: Marketing@example.com +
diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Home/Index.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Home/Index.cshtml new file mode 100644 index 0000000..e3f313d --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Home/Index.cshtml @@ -0,0 +1,108 @@ +@{ + ViewData["Title"] = "Home Page"; +} + + + + diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Login/HashPassword.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Login/HashPassword.cshtml new file mode 100644 index 0000000..56695c5 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Login/HashPassword.cshtml @@ -0,0 +1,72 @@ +@model cloudscribe.Web.SimpleAuth.ViewModels.HashPasswordViewModel + + +@{ + ViewData["Title"] = "Password Hasher"; +} + +

@ViewData["Title"]

+ + +

Hash Password Form

+

+ Simple auth user account information is stored in a simple json file. You could define users with clear text passwords, + but that means anyone who can access the file, such as employees at your web host etc, could access your password. + It would be better to store the passwords as hashed since it would be extremely difficult if not impossible for someone to + determine the password from the hash. This utility uses the ASP.NET Identity PasswordHasher to generate the hashes. + Hashes are one way encryption, they are designed to be impossible to decrypt. + When you login, the password you enter is hashed and validated against the hash in storage, and if it matches authorization is granted. +

+

+ Note however, that if you enter the same password into the hash generator, a different hash will be generated each time, so it is not possible + to just try generating hashes to see if it matches a hash that has been leaked. This makes it very hard for a hacker to get your password from + the hash even if he manages to find out the hash. There is a complex algorythm with + salt added to make sure the hashes are not deterministic. +

+

+ Keep in mind that use of this utility should only be done either from a localhost installation, or from an SSL/TLS protected endpoint. + Don't hash your password while using public wifi. +

+

+ Don't use a password that is the same or following any pattern similar to your other passwords at other web sites. + If you do that and a hacker manages to get your password from any site, he can try to guess passwords for your other website accounts. +

+

+ Be sure to use a password of at least 8 characters, more is better, and use upper and lower case letters as well as numbers and + special characters to make sure you start with a strong password. Don't use dictionary words. We are not masking the password here so make sure no-one is + shoulder surfing when you create your password hash. +

+

+ Once all your users have generated their hashes and their hashes have been added to the simpleauthsettings.json file, you probably should disable this page by setting + EnablePasswordHasherUi as false. + +

+
+
+
+ +
+ + +
+
+ @if (Model.OutputHash.Length > 0) + { + +
+ +
+ + +
+
+ + } + + +
+
+ +
+
+
\ No newline at end of file diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Login/Index.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Login/Index.cshtml new file mode 100644 index 0000000..25173b9 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Login/Index.cshtml @@ -0,0 +1,69 @@ +@model cloudscribe.Web.SimpleAuth.ViewModels.LoginViewModel + +@if (!string.IsNullOrEmpty(Model.RecaptchaSiteKey)) +{ + +} + +@{ + ViewData["Title"] = "Log in"; +} + +

@ViewData["Title"].

+

There are 2 pre-configured example users in simpleauthsettings.json. + You can login with admin/admin or demo/demo +

+

You can of course edit that file to configure your own user accounts and remove the samples.

+
+
+
+
+

Use a local account to log in.

+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+ + +
+
+
+ @if (Model.RecaptchaSiteKey.Length > 0) + { +
+
+
+ @Html.ValidationMessage("recaptchaerror", new { @class = "text-danger" }) +
+
+ + } +
+
+ +
+
+ +
+
+
+
+ +@section Scripts { + @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/Error.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/Error.cshtml new file mode 100644 index 0000000..e514139 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/Error.cshtml @@ -0,0 +1,14 @@ +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +

Development Mode

+

+ Swapping to Development environment will display more detailed information about the error that occurred. +

+

+ 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. +

diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/_Layout.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/_Layout.cshtml new file mode 100644 index 0000000..e61b373 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/_Layout.cshtml @@ -0,0 +1,74 @@ +@inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet + + + + + + @ViewData["Title"] - basic.WebApp.Core11 + + + + + + + + + + @Html.Raw(JavaScriptSnippet.FullScript) + + + +
+ @RenderBody() +
+
+

© 2017 - basic.WebApp.Core11

+
+
+ + + + + + + + + + + + + @RenderSection("Scripts", required: false) + + diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/_LoginPartial.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/_LoginPartial.cshtml new file mode 100644 index 0000000..7356b84 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/_LoginPartial.cshtml @@ -0,0 +1,20 @@ +@using System.Security.Claims +@using cloudscribe.Web.SimpleAuth.Extensions + +@if (User.Identity.IsAuthenticated) +{ + +} +else +{ + +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/_ValidationScriptsPartial.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/_ValidationScriptsPartial.cshtml new file mode 100644 index 0000000..27e0ea7 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/Shared/_ValidationScriptsPartial.cshtml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/_ViewImports.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/_ViewImports.cshtml new file mode 100644 index 0000000..0a50bb5 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/_ViewImports.cshtml @@ -0,0 +1,5 @@ +@using basic.WebApp.Core11 +@using Microsoft.AspNetCore.Http +@using Microsoft.AspNetCore.Http.Authentication +@using Microsoft.AspNetCore.Identity +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/_ViewStart.cshtml b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/_ViewStart.cshtml new file mode 100644 index 0000000..a5f1004 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/appsettings.Development.json b/samples/basic.WebApp.Core11/basic.WebApp.Core11/appsettings.Development.json new file mode 100644 index 0000000..fa8ce71 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/appsettings.json b/samples/basic.WebApp.Core11/basic.WebApp.Core11/appsettings.json new file mode 100644 index 0000000..5fff67b --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/appsettings.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Warning" + } + } +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/basic.WebApp.Core11.csproj b/samples/basic.WebApp.Core11/basic.WebApp.Core11/basic.WebApp.Core11.csproj new file mode 100644 index 0000000..ff04d16 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/basic.WebApp.Core11.csproj @@ -0,0 +1,26 @@ + + + + basic.WebApp.Core11-59f3c1ef-f9bb-40a1-b788-7dcd123eff7d + netcoreapp1.1 + + + + $(PackageTargetFallback);portable-net45+win8+wp8+wpa81; + + + + + + + + + + + + + + + + + diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/bower.json b/samples/basic.WebApp.Core11/basic.WebApp.Core11/bower.json new file mode 100644 index 0000000..b07e3cc --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/bower.json @@ -0,0 +1,10 @@ +{ + "name": "asp.net", + "private": true, + "dependencies": { + "bootstrap": "3.3.7", + "jquery": "2.2.0", + "jquery-validation": "1.14.0", + "jquery-validation-unobtrusive": "3.2.6" + } +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/bundleconfig.json b/samples/basic.WebApp.Core11/basic.WebApp.Core11/bundleconfig.json new file mode 100644 index 0000000..6d3f9a5 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/bundleconfig.json @@ -0,0 +1,24 @@ +// Configure bundling and minification for the project. +// More info at https://go.microsoft.com/fwlink/?LinkId=808241 +[ + { + "outputFileName": "wwwroot/css/site.min.css", + // An array of relative input file paths. Globbing patterns supported + "inputFiles": [ + "wwwroot/css/site.css" + ] + }, + { + "outputFileName": "wwwroot/js/site.min.js", + "inputFiles": [ + "wwwroot/js/site.js" + ], + // Optionally specify minification options + "minify": { + "enabled": true, + "renameLocals": true + }, + // Optionally generate .map file + "sourceMap": false + } +] diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/simpleauthsettings.json b/samples/basic.WebApp.Core11/basic.WebApp.Core11/simpleauthsettings.json new file mode 100644 index 0000000..4d588e3 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/simpleauthsettings.json @@ -0,0 +1,55 @@ +{ + "SimpleAuthSettings": { + "EnablePasswordHasherUi": "true", + "Comment-Recaptcha": "get your recaptcha keys here https://www.google.com/recaptcha/intro/index.html", + "RecaptchaPublicKey": "", + "RecaptchaPrivateKey": "", + "AuthenticationScheme": "application" + + }, + + "Users": [ + { + "UserName": "admin", + "Password": "admin", + "PasswordIsHashed": "false", + "Claims": [ + { + "ClaimType": "DisplayName", + "ClaimValue": "Mr Cool!" + }, + { + "ClaimType": "Email", + "ClaimValue": "foo@foo.org" + }, + { + "ClaimType": "Role", + "ClaimValue": "Admins" + } + + ] + }, + { + "UserName": "demo", + "Password": "demo", + "PasswordIsHashed": "false", + "Claims": [ + { + "ClaimType": "DisplayName", + "ClaimValue": "Mr Awesome" + }, + { + "ClaimType": "Email", + "ClaimValue": "demo@demo.com" + }, + { + "ClaimType": "Role", + "ClaimValue": "Admins" + } + + ] + } + ] + + +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/css/site.css b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/css/site.css new file mode 100644 index 0000000..e31abde --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/css/site.css @@ -0,0 +1,37 @@ +body { + padding-top: 50px; + padding-bottom: 20px; +} + +/* Wrapping element */ +/* Set some basic padding to keep content from hitting the edges */ +.body-content { + padding-left: 15px; + padding-right: 15px; +} + +/* Set widths on the form inputs since otherwise they're 100% wide */ +input, +select, +textarea { + max-width: 280px; +} + +/* Carousel */ +.carousel-caption p { + font-size: 20px; + line-height: 1.4; +} + +/* Make .svg files in the carousel display properly in older browsers */ +.carousel-inner .item img[src$=".svg"] { + width: 100%; +} + +/* Hide/rearrange for smaller screens */ +@media screen and (max-width: 767px) { + /* Hide captions */ + .carousel-caption { + display: none; + } +} diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/css/site.min.css b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/css/site.min.css new file mode 100644 index 0000000..3beb45f --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/css/site.min.css @@ -0,0 +1 @@ +body{padding-top:50px;padding-bottom:20px}.body-content{padding-left:15px;padding-right:15px}input,select,textarea{max-width:280px}.carousel-caption p{font-size:20px;line-height:1.4}.carousel-inner .item img[src$=".svg"]{width:100%}@media screen and (max-width:767px){.carousel-caption{display:none}} \ No newline at end of file diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/favicon.ico b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/favicon.ico new file mode 100644 index 0000000..a3a7999 Binary files /dev/null and b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/favicon.ico differ diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner1.svg b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner1.svg new file mode 100644 index 0000000..1ab32b6 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner2.svg b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner2.svg new file mode 100644 index 0000000..9679c60 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner3.svg b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner3.svg new file mode 100644 index 0000000..9be2c25 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner3.svg @@ -0,0 +1 @@ +banner3b \ No newline at end of file diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner4.svg b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner4.svg new file mode 100644 index 0000000..38b3d7c --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/images/banner4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/js/site.js b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/js/site.js new file mode 100644 index 0000000..82ecce7 --- /dev/null +++ b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/js/site.js @@ -0,0 +1 @@ +// Write your Javascript code. diff --git a/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/js/site.min.js b/samples/basic.WebApp.Core11/basic.WebApp.Core11/wwwroot/js/site.min.js new file mode 100644 index 0000000..e69de29 diff --git a/samples/basic.WebApp/src/basic.WebApp/Views/Login/Index.cshtml b/samples/basic.WebApp/src/basic.WebApp/Views/Login/Index.cshtml index 4a734ab..b7aa1a0 100644 --- a/samples/basic.WebApp/src/basic.WebApp/Views/Login/Index.cshtml +++ b/samples/basic.WebApp/src/basic.WebApp/Views/Login/Index.cshtml @@ -20,7 +20,7 @@
-
+

Use a local account to log in.