ASP.Net-Core中的自定义身份validation

我正在开发一个需要与现有用户数据库集成的Web应用程序。 我仍然想使用[Authorize]属性,但我不想使用Identity框架。 如果我确实想使用Identity框架,我会在startup.cs文件中添加这样的内容:

 services.AddIdentity(options => { options.Password.RequireNonLetterOrDigit = false; }).AddEntityFrameworkStores() .AddDefaultTokenProviders(); 

我假设我必须在那里添加其他东西,然后创建某种实现特定接口的类? 有人能指出我正确的方向吗? 我正在使用asp.net 5的RC1。

在ASP.NET Core中创建自定义身份validation可以通过多种方式完成。 如果要构建现有组件(但不想使用标识),请检查docs.asp.net上的“安全”类别的文档。 https://docs.asp.net/en/latest/security/index.html

您可能会发现一些有用的文章:

使用没有ASP.NET身份的Cookie中间件

自定义基于策略的授权

当然,如果失败或文档不够清楚,源代码位于https://github.com/aspnet/Security ,其中包含一些示例。

根据我在几天研究后学到的内容,这是ASP .Net Core MVC 2.x自定义用户身份validation指南

Startup.cs

将以下行添加到ConfigureServices方法:

 public void ConfigureServices(IServiceCollection services) { services.AddAuthentication( CookieAuthenticationDefaults.AuthenticationScheme ).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.LoginPath = "/Account/Login"; options.LogoutPath = "/Account/Logout"; }); services.AddMvc(); // authentication services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; }); services.AddTransient( m => new UserManager( Configuration .GetValue( DEFAULT_CONNECTIONSTRING //this is a string constant ) ) ); services.AddDistributedMemoryCache(); } 

请记住,在上面的代码中,我们说如果任何未经身份validation的用户请求使用[Authorize]注释的操作,他们就会强制重定向到/Account/Login url。

Configure方法中添加以下行:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler(ERROR_URL); } app.UseStaticFiles(); app.UseAuthentication(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: DEFAULT_ROUTING); }); } 

创建也将管理登录和注销的UserManager类。 它应该看起来像下面的片段(注意我正在使用短小精悍):

 public class UserManager { string _connectionString; public UserManager(string connectionString) { _connectionString = connectionString; } public async void SignIn(HttpContext httpContext, UserDbModel user, bool isPersistent = false) { using (var con = new SqlConnection(_connectionString)) { var queryString = "sp_user_login"; var dbUserData = con.Query( queryString, new { UserEmail = user.UserEmail, UserPassword = user.UserPassword, UserCellphone = user.UserCellphone }, commandType: CommandType.StoredProcedure ).FirstOrDefault(); ClaimsIdentity identity = new ClaimsIdentity(this.GetUserClaims(dbUserData), CookieAuthenticationDefaults.AuthenticationScheme); ClaimsPrincipal principal = new ClaimsPrincipal(identity); await httpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal); } } public async void SignOut(HttpContext httpContext) { await httpContext.SignOutAsync(); } private IEnumerable GetUserClaims(UserDbModel user) { List claims = new List(); claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Id().ToString())); claims.Add(new Claim(ClaimTypes.Name, user.UserFirstName)); claims.Add(new Claim(ClaimTypes.Email, user.UserEmail)); claims.AddRange(this.GetUserRoleClaims(user)); return claims; } private IEnumerable GetUserRoleClaims(UserDbModel user) { List claims = new List(); claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Id().ToString())); claims.Add(new Claim(ClaimTypes.Role, user.UserPermissionType.ToString())); return claims; } } 

那么也许你有一个AccountController ,它有一个Login Action,如下所示:

 public class AccountController : Controller { UserManager _userManager; public AccountController(UserManager userManager) { _userManager = userManager; } [HttpPost] public IActionResult LogIn(LogInViewModel form) { if (!ModelState.IsValid) return View(form); try { //authenticate var user = new UserDbModel() { UserEmail = form.Email, UserCellphone = form.Cellphone, UserPassword = form.Password }; _userManager.SignIn(this.HttpContext, user); return RedirectToAction("Search", "Home", null); } catch (Exception ex) { ModelState.AddModelError("summary", ex.Message); return View(form); } } } 

现在,您可以在任何ActionController上使用[Authorize]注释。

随意评论任何问题或错误。