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 인증을 수행하는 예제 항목에서 일부 코드를 대여하여 이 작업을 수행합니다.
    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() 등록 방안과 설정 AccessDeniedPathLoginPath을 호출합니다.이러한 구성 값을 지정하여 사용자가 다음을 수행할 경우 다음을 알 수 있습니다.
  • 은 자격 증명을 제공할 수 없음 /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();
    }
    
  • 사용자가 로그인 버튼을 눌렀을 때 POST를 통해 Login() 방법을 호출할 것을 요청합니다.우리는 usernamepassword을 제공했고 우리는 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 애플리케이션다음 부분에서 우리는 사용자에게 권한을 부여하는 방법, 즉 어떤 사용자가 어떤 자원을 방문해야 하는지를 확인하는 방법을 연구할 것이다.

    좋은 웹페이지 즐겨찾기