ASP의 사용자 지정 인증입니다.넷코어
저는 기존 사용자 데이터베이스와 통합해야 하는 웹 앱을 개발하고 있습니다.나는 여전히 사용하고 싶습니다.[Authorize]
속성이지만 Identity 프레임워크를 사용하지 않습니다.Identity 프레임워크를 사용하려면 startup.cs 파일에 다음과 같은 내용을 추가합니다.
services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
options.Password.RequireNonLetterOrDigit = false;
}).AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
거기에 다른 것을 추가한 다음 특정 인터페이스를 구현하는 클래스를 만들어야 한다고 생각합니다.누가 저를 올바른 방향으로 안내해 주시겠습니까?저는 지금 asp.net 5의 RC1을 사용하고 있습니다.
며칠간의 조사를 통해 알게 된 ASP 가이드는 다음과 같습니다.NetCore 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();
}
위의 코드에서 인증되지 않은 사용자가 주석이 달린 작업을 요청할 경우 우리는 말했습니다.[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
로그인 및 로그아웃도 관리하는 클래스입니다.아래 스니펫처럼 보여야 합니다(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;
}
}
그럼 아마 당신은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
.
질문이나 버그에 대해 자유롭게 의견을 제시하십시오.
ASP.NET Core에서 사용자 정의 인증을 만드는 방법은 다양합니다.기존 구성 요소를 구축하고 싶지만 ID를 사용하지 않으려면 docs.asp.net 에서 문서의 "보안" 범주를 확인하십시오.https://docs.asp.net/en/latest/security/index.html
도움이 될 수 있는 몇 가지 기사:
물론, 만약 그것이 실패하거나 문서가 충분히 명확하지 않다면, 소스 코드는 https://github.com/dotnet/aspnetcore/tree/master/src/Security 에 있습니다. 여기에는 몇 가지 샘플이 포함되어 있습니다.
.NET Core 3에서 솔루션을 구현할 모든 사용자를 위해 훌륭한 @AmiNadimi 답변에 추가하고자 합니다.
우선, 당신은 다음의 서명을 변경해야 합니다.SignIn
의 방법.UserManager
클래스:
public async void SignIn(HttpContext httpContext, UserDbModel user, bool isPersistent = false)
대상:
public async Task SignIn(HttpContext httpContext, UserDbModel user, bool isPersistent = false)
절대로 사용해서는 안 되기 때문입니다.async void
특히 당신이 함께 일한다면요.HttpContext
출처:마이크로소프트 문서
마지막, 하지만 중요한 것은, 당신의Configure()
.Startup.cs
에는 포해야합니가 포함되어야 합니다.app.UseAuthorization
그리고.app.UseAuthentication
적절한 순서대로:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
@Manish Jain, 저는 부울 리턴으로 메소드를 구현할 것을 제안합니다.
public class UserManager
{
// Additional code here...
public async Task<bool> SignIn(HttpContext httpContext, UserDbModel user)
{
// Additional code here...
// Here the real authentication against a DB or Web Services or whatever
if (user.Email != null)
return false;
ClaimsIdentity identity = new ClaimsIdentity(this.GetUserClaims(dbUserData), CookieAuthenticationDefaults.AuthenticationScheme);
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
// This is for give the authentication cookie to the user when authentication condition was met
await httpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
return true;
}
}
언급URL : https://stackoverflow.com/questions/36095076/custom-authentication-in-asp-net-core
'programing' 카테고리의 다른 글
루비의 나눗셈이 십진수 값이 아닌 정수를 반환하는 이유는 무엇입니까? (0) | 2023.07.10 |
---|---|
경로 전환 시 Vuex 재설정 저장소 변수 (0) | 2023.07.10 |
각도를 사용하여 배열의 객체 인덱스를 가져오려면 어떻게 해야 합니까? (0) | 2023.07.10 |
SQL Server 통합 서비스를 사용하여 Oracle 데이터베이스에 연결 (0) | 2023.07.10 |
"Table'dbo"를 해결하려면 어떻게 해야 합니까?Foo'가 이미 존재합니다." 테이블이 존재하지 않을 때 오류가 발생합니까? (0) | 2023.07.10 |