ASP.Net-Core의 사용자 지정 인증
기존 사용자 데이터베이스와 통합해야하는 웹 앱을 개발 중입니다. 여전히 [Authorize]
속성을 사용하고 싶지만 Identity 프레임 워크를 사용하고 싶지 않습니다. Identity 프레임 워크를 사용하고 싶다면 startup.cs 파일에 다음과 같이 추가합니다.
services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
options.Password.RequireNonLetterOrDigit = false;
}).AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
나는 거기에 다른 것을 추가해야한다고 가정하고 특정 인터페이스를 구현하는 일종의 클래스를 만들어야합니까? 누군가 나를 올바른 방향으로 가리킬 수 있습니까? 지금 asp.net 5의 RC1을 사용하고 있습니다.
ASP.NET Core에서 사용자 지정 인증을 만드는 것은 다양한 방법으로 수행 할 수 있습니다. 기존 구성 요소를 구축하고 싶지만 ID를 사용하지 않으려면 docs.asp.net에서 문서의 "보안"범주를 확인하십시오. https://docs.asp.net/en/latest/security/index.html
도움이 될만한 기사 :
물론 실패하거나 문서가 명확하지 않은 경우 소스 코드는 https://github.com/aspnet/Security에 있으며 여기에는 몇 가지 샘플이 포함되어 있습니다.
며칠간의 연구 끝에 배운 것에서 ASP .Net Core MVC 2.x 사용자 지정 사용자 인증 가이드가 있습니다.
에서 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<string>(
DEFAULT_CONNECTIONSTRING //this is a string constant
)
)
);
services.AddDistributedMemoryCache();
}
위의 코드에서 인증되지 않은 사용자가로 주석이 추가 된 작업을 요청하면 URL로 [Authorize]
강제로 리디렉션 된다고 언급했습니다 /Account/Login
.
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
로그인 및 로그 아웃도 관리 할 클래스를 만듭니다 . 아래 스 니펫처럼 보일 것입니다 (저는 dapper를 사용하고 있습니다).
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<UserDbModel>(
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<Claim> GetUserClaims(UserDbModel user)
{
List<Claim> claims = new List<Claim>();
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<Claim> GetUserRoleClaims(UserDbModel user)
{
List<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Id().ToString()));
claims.Add(new Claim(ClaimTypes.Role, user.UserPermissionType.ToString()));
return claims;
}
}
그러면 아래와 같은 Action 이있는 AccountController
것이 있을 수 있습니다 Login
.
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);
}
}
}
이제 [Authorize]
모든 Action
또는에서 주석 을 사용할 수 있습니다 Controller
.
질문이나 버그에 대해 자유롭게 의견을 말하십시오.
참조 URL : https://stackoverflow.com/questions/36095076/custom-authentication-in-asp-net-core
'IT Share you' 카테고리의 다른 글
Visual Studio Code에서 솔루션 파일을 열 수 없습니다. (0) | 2020.12.15 |
---|---|
리스너가 람다로 대체 될 수 있다는 것은 무엇을 의미합니까? (0) | 2020.12.15 |
Log4Net "스키마 정보를 찾을 수 없습니다"메시지 (0) | 2020.12.15 |
Joda-Time 사용에 대한 단점이 있습니까? (0) | 2020.12.15 |
HTTP POST는 무한 할 수 있습니까? (0) | 2020.12.15 |