{"id":19214651,"url":"https://github.com/birajmainali/custom-authentication-for-dotnet","last_synced_at":"2026-05-31T16:32:04.909Z","repository":{"id":112772099,"uuid":"438977314","full_name":"BirajMainali/custom-authentication-for-dotnet","owner":"BirajMainali","description":"Modular dotnet-6 project for custom user authentication","archived":false,"fork":false,"pushed_at":"2022-03-10T13:40:19.000Z","size":17,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-04T18:13:04.156Z","etag":null,"topics":["authentication","dotnet-core"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BirajMainali.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-16T12:13:54.000Z","updated_at":"2023-11-01T10:54:01.000Z","dependencies_parsed_at":"2023-03-10T07:31:02.686Z","dependency_job_id":null,"html_url":"https://github.com/BirajMainali/custom-authentication-for-dotnet","commit_stats":null,"previous_names":["birajmainali/custom-authentication-for-dotnet"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BirajMainali%2Fcustom-authentication-for-dotnet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BirajMainali%2Fcustom-authentication-for-dotnet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BirajMainali%2Fcustom-authentication-for-dotnet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BirajMainali%2Fcustom-authentication-for-dotnet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BirajMainali","download_url":"https://codeload.github.com/BirajMainali/custom-authentication-for-dotnet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240288195,"owners_count":19777627,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authentication","dotnet-core"],"created_at":"2024-11-09T14:10:52.331Z","updated_at":"2025-11-14T16:11:46.212Z","avatar_url":"https://github.com/BirajMainali.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Modular User service.\n\n## Extra configuration for `Web Project`.\n\n##### Ensure HTTP request pipeline configuration.\n\n```cs\n\napp.UseAuthentication();\napp.UseAuthorization();\n\napp.MapControllerRoute(\n    name: \"default\",\n    pattern: \"{controller=Home}/{action=Index}/{id?}\").RequireAuthorization(); // enabling authentication for all endpoints\n```\n\n\n##### Add new authentication service and `UseUserconfiguration` which is the extension method `IServiceCollection` located at `Application\\DiConfigutaion`.\n```cs\n  services.UseUserConfiguration();\n  services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)\n                .AddCookie(x =\u003e { x.LoginPath = \"/Login\"; });\n```\n\n##### Create new authentication manager on `Web Project` \n\n```cs\npublic interface IAuthManager\n    {\n        Task\u003cAuthResult\u003e Login(string identity, string password);\n    }\n```\n\n```cs\npublic class AuthenticationManager : IAuthenticationManager\n    {\n        private readonly IHttpContextAccessor _httpContextAccessor;\n        private readonly IUserRepository _userRepository;\n\n        public AuthManager(IHttpContextAccessor httpContextAccessor, IUserRepository userRepository)\n        {\n            _httpContextAccessor = httpContextAccessor;\n            _userRepository = userRepository;\n        }\n\n        public async Task\u003cAuthResult\u003e Login(string identity, string password)\n        {\n            var user = await _userRepository.GetItemAsync(x =\u003e x.Email.ToLower() == identity.ToLower().Trim());\n            var result = new AuthResult();\n            if (user == null)\n            {\n                result.Success = false;\n                result.Errors.Add(\"User not found\");\n                return result;\n            }\n\n            if (!Crypter.Verify(password, user.Password))\n            {\n                result.Success = false;\n                result.Errors.Add(\"Invalid password\");\n                return result;\n            }\n\n            var httpContext = _httpContextAccessor.HttpContext;\n            var claims = new List\u003cClaim\u003e\n            {\n                new(\"Id\", user.Id.ToString())\n            };\n            var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);\n            await httpContext.SignInAsync(\n                CookieAuthenticationDefaults.AuthenticationScheme,\n                new ClaimsPrincipal(claimsIdentity));\n            result.Success = true;\n            return result;\n        }\n    }\n\n    public class AuthResult\n    {\n        public List\u003cstring\u003e Errors = new();\n        public bool Success;\n    }\n```\n\n##### Login / Register User\n\n```cs\npublic IActionResult Index() =\u003e View(new LoginVm());\n\n        [HttpPost]\n        public async Task\u003cIActionResult\u003e Index(LoginVm vm)\n        {\n            try\n            {\n                var result = await _authManager.Login(vm.Email, vm.Password);\n                if (result.Success) return RedirectToAction(\"Index\", \"Home\");\n                ModelState.AddModelError(nameof(vm.Password), result.Errors.FirstOrDefault()!);\n                vm.Password = \"\";\n                return View(vm);\n            }\n            catch (Exception e)\n            {\n                TempData[\"error\"] = e.Message; // Send error notification.\n                return View();\n            }\n        }\n```\n```cs\n[HttpGet]\n        public IActionResult Register() =\u003e View(new UserVm());\n\n        [HttpPost]\n        public async Task\u003cIActionResult\u003e Register(UserVm vm)\n        {\n            try\n            {\n                var userDto = new UserDto(vm.Name, vm.Gender, vm.Email, vm.Password, vm.Address, vm.Phone);\n                var user = await _userService.CreateUser(userDto);\n                TempData[\"success\"] = $\"User {user.Name} has been added\"; // Send register success notificatio.\n                return RedirectToAction(nameof(Index));\n            }\n            catch (Exception e)\n            {\n                TempData[\"error\"] = e.Message; // // Send error notification.\n                return View();\n            }\n        }\n```\n\n##### Creating current user provider \n\n```cs\npublic interface ICurrentUserProvider\n    {\n        bool IsLoggedIn();\n        Task\u003cAuthUser\u003e GetCurrentUser();\n        long? GetCurrentUserId();\n    }\n```\n\n```cs\npublic class CurrentUserProvider : ICurrentUserProvider\n    {\n        private readonly IHttpContextAccessor _contextAccessor;\n        private readonly IUserRepository _userRepository;\n\n        public CurrentUserProvider(IHttpContextAccessor contextAccessor, IUserRepository userRepository)\n        {\n            _contextAccessor = contextAccessor;\n            _userRepository = userRepository;\n        }\n\n        public bool IsLoggedIn() \n            =\u003e GetCurrentUserId() != null;\n\n        public async Task\u003cAuthUser\u003e GetCurrentUser()\n        {\n            var userId = GetCurrentUserId();\n            if (userId.HasValue) return await _userRepository.FindOrThrowAsync(userId.Value);\n            return null;\n        }\n\n        public long? GetCurrentUserId()\n        {\n            var userId = _contextAccessor.HttpContext?.User.FindFirstValue(\"Id\");\n            if (string.IsNullOrWhiteSpace(userId)) return null;\n            return Convert.ToInt64(userId);\n        }\n    }\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbirajmainali%2Fcustom-authentication-for-dotnet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbirajmainali%2Fcustom-authentication-for-dotnet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbirajmainali%2Fcustom-authentication-for-dotnet/lists"}