ASP의 인증그물심
This article covers authentication in ASP .NET Core. It tries to explain the concepts and how they relate and also shows some code so you can hopefully add authentication to your own .NET app.
사용자를 인증한다는 것은 사용자의 신분을 확정하는 것을 의미한다.우리가 이렇게 하는 것은 그들이 그들이 말한 사람이라는 것을 확보하기 위해서이다.일단 우리가 그들을 신뢰할 수 있다면, 우리는 그들을 우리 프로그램에 로그인시키고, 그들에게 로그인한 사용자만이 접근해야 할 자원을 보여줄 수 있다.
주요 장면
다음은 우리가 해결하고자 하는 주요 상황이다.
인증 흐름을 처리하는 서비스
인증 흐름을 실행하려면 처리 프로그램이 필요합니다.여러 개의 프로세서가 있을 수 있지만,
IAuthenticationService
인터페이스를 실현해야 합니다.인증 중간부품은 처리 프로그램을 사용합니다.등록된 인증 프로세서와 설정 옵션을 '방안' 이라고 합니다.음모
시나리오를 사용하려면 다음과 같은
Startup.ConfigureServices
에 등록해야 합니다.void ConfigureServices()
{
// register your scheme
}
먼저 AddAuthentication()
을 호출하고 다음 예와 같이 특정 시나리오를 호출해야 합니다.void ConfigureServices()
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => Configuration.Bind("CookieSettings", options));
}
여기서 우리는 AddAuthentication()
을 호출한 다음에 AddJwtBearer()
과 AddCookie()
두 방안을 호출한다.이 방안들을 호출하면 그것들과 설정 설정을 등록할 수 있습니다.You don't always need to explicitly call
AddAuthentication()
, if you use ASP .NET Identity, that call is done internally for you.
중간부품 설정
우리가 왜 이 단계를 집행해야 하는지 이해하기 위해서, 우선 요청 파이프라인에 대해 토론합시다.다음 장면을 상상해 보세요.
The calling client makes a request towards a resource on your system. To allow for that to happen, they need to be logged in to your system. To log in, the user needs to provide credentials (typically username and password) that convinces us they are who they say they are. We call this to authenticate. However, we need to write code to ensure the request is intercepted and we have a chance to validate the user. This is why we now need to talk to middleware and configure it to use the handlers/schemes we registered thus far with ASP .NET.
이제
Configure()
클래스의 다른 방법인 Startup
으로 이동하여 다음과 같이 UseAuthentication()
을 호출합니다.void Configure()
{
UseAuthentication();
}
You need to call
UseAuthentication()
in the right time so anything dependent on the auth can use it. Here's som guidelines:
- After
UseRouting()
, so that route information is available for authentication decisions.- Before
UseEndpoints()
, so that users are authenticated before accessing the endpoints.
사용자 인증
지금까지 당신은 세 부분 중 두 부분을 보았습니다.
Cookie authentication
등록 시나리오/프로세서
우선, 우리는 1) 가동 중인
ConfigureServices()
방법에 이 방안을 등록하는 것을 검사한다.대테러 엘리트:public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthentication(CookieScheme) // Sets the default scheme to cookies
.AddCookie(CookieScheme, options =>
{
options.AccessDeniedPath = "/account/denied";
options.LoginPath = "/account/login";
});
// Example of how to customize a particular instance of cookie options and
// is able to also use other services.
services.AddSingleton<IConfigureOptions<CookieAuthenticationOptions>, ConfigureMyCookie>();
}
AddCookie()
등록 방안과 설정 AccessDeniedPath
과 LoginPath
을 호출합니다.이러한 구성 값을 지정하여 사용자가 다음을 수행할 경우 다음을 알 수 있습니다./account/denied
/account/login
에 로그인한 곳중간부품 설정
우리는 이미 이 방안을 등록해서 그것을 사용할 준비를 했다.우리의 다음 단계는
UseAuthentication()
으로 전화를 걸어 우리의 응용 프로그램에 그것을 사용하라고 명확하게 알려주는 것이다.public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
});
}
app.UseAuthentication()
에 대한 호출과 UseRouting()
에 대한 호출 후의 상황을 주의하십시오. 그러면 우리는 루트 정보를 얻을 수 있습니다. UseEndpoints()
에 대한 호출 전에 후자는 신분 검증 기능을 이용할 수 있습니다.실제 인증 수행
우리가 이 방안을 등록할 때, 우리는 이 방안이 어디에 로그인하는지 알려 준다. 즉,
/account/login
. 이것은 우리가 작성해야 할 컨트롤러 종류와 방법이다.따라서 다음을 포함하는 AccountController.cs
을 만듭니다.using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
namespace AuthSamples.Cookies.Controllers;
public class AccountController : Controller
{
}
본 교육 과정에 다음과 같은 내용을 기입해야 합니다.여기서 EMC 디렉터 코드는 다음과 같이 간단해졌습니다.
[HttpGet]
public IActionResult Login(string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
return View();
}
템플릿이 있기 때문에 로그인을 보여 줍니다.cshtml:<h2>Login</h2>
<div class="row">
<div class="col-md-8">
<section>
<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal" role="form">
<div class="form-group">
<label class="col-md-2 control-label">User</label>
<div class="col-md-10">
<input type="text" name="username" />
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">Password</label>
<div class="col-md-10">
<input type="password" name="password" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<button type="submit" class="btn btn-default">Log in</button>
</div>
</div>
</form>
</section>
</div>
</div>
위의 템플릿은 사용자 이름 필드, 암호 필드 및 제출 버튼으로 구성됩니다.로그인 요청 처리
이제 사용자가 자격 증명을 위 형식으로 입력한 다음, 다음을 처리하려면 컨트롤러 코드가 필요합니다.
private bool ValidateLogin(string userName, string password)
{
// For this sample, all logins are successful.
return true;
}
[HttpPost]
public async Task<IActionResult> Login(string userName, string password, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
// Normally Identity handles sign in, but you can do it directly
if (ValidateLogin(userName, password))
{
var claims = new List<Claim>
{
new Claim("user", userName),
new Claim("role", "Member")
};
await HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "role")));
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return Redirect("/");
}
}
return View();
}
Login()
방법을 호출할 것을 요청합니다.우리는 username
과 password
을 제공했고 우리는 ValidateLogin()
을 호출했다(이곳에서 당신은 보통 데이터베이스를 호출하여 사용자를 검증하고 사용자의 존재, 비밀번호가 정확함을 확보해야 한다).ValidateLogin()
이true로 응답하면.HttpContext.SignInAsync()
으로 전화를 걸었을 때 발생했습니다.이 방법은 ClaimsPrincipal
의 실례를 만들어야 한다.이 대상은 실례로 ClaimsIdentity
대상이 필요하다.높은 수준에서 우리는 사용자가 누구인지 말한 다음에 사용자가 권한을 수여하는 과정에서 시스템에 접근할 수 있는 어떤 부분을 확정할 수 있다.사용자는 로그아웃할 수 있습니다. 이 문제를 처리하려면 다음과 같이
AccountController
클래스에 다른 방법을 추가할 수 있습니다.public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync();
return Redirect("/");
}
HttpContext.SignOutAsync()
으로 전화하면 로그인 세션에 대한 모든 정보가 잊혀집니다.여기의 경우:
올바른 라우팅 사용자
이 점에서, 당신은 시스템이 어떻게 사용자를 이 로그인 폼에 보내는지 알고 싶습니까? 예를 들어 누가 로그인했는지 어떻게 검사하는지 알고 싶습니까?
이것은 우리가 Home Controller를 볼 때이다.cs 파일.이것은 인증을 거치지 않은 경우 속성 클래스
Authorize
을 사용하여 사용자의 로그인을 강제합니다.다음은 작동 방법입니다./Home/MyClaims
으로 이동 시도 [Authorize]
public IActionResult MyClaims()
{
return View();
}
MyClaims
함수로 표시된 보기가 표시됩니다.로그인하지 않으면 account/login
으로 이동합니다.요약
이제 사용자를 인증하고 ASP에 로그인하는 방법을 이해할 수 있는 좋은 출발점이 되었으면 합니다.NET 애플리케이션다음 부분에서 우리는 사용자에게 권한을 부여하는 방법, 즉 어떤 사용자가 어떤 자원을 방문해야 하는지를 확인하는 방법을 연구할 것이다.
Reference
이 문제에 관하여(ASP의 인증그물심), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dotnet/authentication-in-asp-net-core-59k8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)