ASP.NET Core 에서 기본 적 인 신분 인증 을 어떻게 실현 하 는 지 에 대해 말씀 드 리 겠 습 니 다.

10264 단어 .netcore인증
ASP.NET 은 드디어 플랫폼 을 뛰 어 넘 을 수 있 습 니 다.그러나 우리 가 자주 사용 하 는 ASP.NET 이 아니 라 ASP.NET Core 라 는 새로운 플랫폼 입 니 다.그 는 Windows,Linux,OS X 등 플랫폼 을 뛰 어 넘 어 웹 응용 프로그램 을 배치 할 수 있 습 니 다.이 프레임 워 크 는 ASP.NET 의 다음 버 전 입 니 다.전통 적 인 ASP.NET 프로그램 에 비해 다른 부분 이 있 습 니 다.예 를 들 어 많은 라 이브 러 리 는 이 두 플랫폼 사이 에서 통용 되 지 않 는 다.
오늘 은 우선 ASP.NET Core 에서 로그 인 기능 과 함께 기본 적 인 인증 을 실현 합 니 다.
초기 준비:
1.VS 2015 Update 3 를 IDE 로 추천 합 니 다.다운로드 주소:https://www.jb51.net/softjc/446184.html
2...........................................................................
만 든 항목:
VS 에 새 항목 을 만 들 때,항목 유형 은 ASP.NET Core Web Application(.NET Core)을 선택 하고,항목 이름 은 TestBasic Author 를 입력 합 니 다.

다음은 웹 애플 리 케 이 션,오른쪽 인증 선택:인증 없 음

Startup.cs 열기
Configure Services 방법 에 다음 코드 를 추가 합 니 다.

services.AddAuthorization(); 
Configure 방법 에 다음 코드 를 추가 합 니 다:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
  AuthenticationScheme = "Cookie", 
  LoginPath = new PathString("/Account/Login"), 
  AccessDeniedPath = new PathString("/Account/Forbidden"), 
  AutomaticAuthenticate = true, 
  AutomaticChallenge = true 
});
전체 코드 는 다음 과 같 아야 합 니 다:

public void ConfigureServices(IServiceCollection services) 
{ 
  services.AddMvc(); 
 
  services.AddAuthorization(); 
} 
 
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
  app.UseCookieAuthentication(new CookieAuthenticationOptions 
  { 
    AuthenticationScheme = "Cookie", 
    LoginPath = new PathString("/Account/Login"), 
    AccessDeniedPath = new PathString("/Account/Forbidden"), 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true 
  }); 
 
  app.UseMvc(routes => 
  { 
    routes.MapRoute( 
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
  }); 
}
붙 인 코드 가 잘못 되 었 다 는 것 을 알 게 될 것 입 니 다.이것 은 해당 하 는 가방 을 도입 하지 않 았 기 때 문 입 니 다.잘못된 줄 에 들 어가 전 구 를 클릭 하고 해당 하 는 가방 을 불 러 오 면 됩 니 다.

프로젝트 다음 에 Model 라 는 폴 더 를 만 들 고 User.cs 클래스 를 추가 합 니 다.
코드 가 이 럴 거 예요.

public class User
{
  public string UserName { get; set; }
  public string Password { get; set; }
}
컨트롤 러 를 만 듭 니 다.이름 은 AccountController.cs 입 니 다.
클래스 에 다음 코드 를 붙 입 니 다:

[HttpGet] 
public IActionResult Login() 
{ 
  return View(); 
} 
 
[HttpPost] 
public async Task<IActionResult> Login(User userFromFore) 
{ 
  var userFromStorage = TestUserStorage.UserList 
    .FirstOrDefault(m => m.UserName == userFromFore.UserName && m.Password == userFromFore.Password); 
 
  if (userFromStorage != null) 
  { 
    //you can add all of ClaimTypes in this collection 
    var claims = new List<Claim>() 
    { 
      new Claim(ClaimTypes.Name,userFromStorage.UserName) 
      //,new Claim(ClaimTypes.Email,"[email protected]") 
    }; 
 
    //init the identity instances 
    var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "SuperSecureLogin")); 
 
    //signin 
    await HttpContext.Authentication.SignInAsync("Cookie", userPrincipal, new AuthenticationProperties 
    { 
      ExpiresUtc = DateTime.UtcNow.AddMinutes(20), 
      IsPersistent = false, 
      AllowRefresh = false 
    }); 
 
    return RedirectToAction("Index", "Home"); 
  } 
  else 
  { 
    ViewBag.ErrMsg = "UserName or Password is invalid"; 
 
    return View(); 
  } 
} 
 
public async Task<IActionResult> Logout() 
{ 
  await HttpContext.Authentication.SignOutAsync("Cookie"); 
 
  return RedirectToAction("Index", "Home"); 
}
같은 파일 에 아 날로 그 사용자 가 저장 한 클래스 를 추가 합 니 다.

//for simple, I'm not using the database to store the user data, just using a static class to replace it.
public static class TestUserStorage
{
  public static List<User> UserList { get; set; } = new List<User>() {
    new User { UserName = "User1",Password = "112233"}
  };
}
다음은 각종 인용 오 류 를 복구 합 니 다.
완전한 코드 는 이렇게 해 야 합 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using TestBasicAuthor.Model;
using System.Security.Claims;
using Microsoft.AspNetCore.Http.Authentication;

// For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860

namespace TestBasicAuthor.Controllers
{
  public class AccountController : Controller
  {
    [HttpGet]
    public IActionResult Login()
    {
      return View();
    }

    [HttpPost]
    public async Task<IActionResult> Login(User userFromFore)
    {
      var userFromStorage = TestUserStorage.UserList
        .FirstOrDefault(m => m.UserName == userFromFore.UserName && m.Password == userFromFore.Password);

      if (userFromStorage != null)
      {
        //you can add all of ClaimTypes in this collection 
        var claims = new List<Claim>()
        {
          new Claim(ClaimTypes.Name,userFromStorage.UserName) 
          //,new Claim(ClaimTypes.Email,"[email protected]") 
        };

        //init the identity instances 
        var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "SuperSecureLogin"));

        //signin 
        await HttpContext.Authentication.SignInAsync("Cookie", userPrincipal, new AuthenticationProperties
        {
          ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
          IsPersistent = false,
          AllowRefresh = false
        });

        return RedirectToAction("Index", "Home");
      }
      else
      {
        ViewBag.ErrMsg = "UserName or Password is invalid";

        return View();
      }
    }

    public async Task<IActionResult> Logout()
    {
      await HttpContext.Authentication.SignOutAsync("Cookie");

      return RedirectToAction("Index", "Home");
    }
  }

  //for simple, I'm not using the database to store the user data, just using a static class to replace it.
  public static class TestUserStorage
  {
    public static List<User> UserList { get; set; } = new List<User>() {
    new User { UserName = "User1",Password = "112233"}
  };
  }
}

Views 폴 더 에 account 폴 더 를 만 들 고 account 폴 더 에 index.cshtml 의 View 파일 을 만 듭 니 다.
다음 코드 를 붙 입 니 다:

@model TestBasicAuthor.Model.User

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
</head>
<body>
  @using (Html.BeginForm())
  {
    <table>
      <tr>
        <td></td>
        <td>@ViewBag.ErrMsg</td>
      </tr>
      <tr>
        <td>UserName</td>
        <td>@Html.TextBoxFor(m => m.UserName)</td>
      </tr>
      <tr>
        <td>Password</td>
        <td>@Html.PasswordFor(m => m.Password)</td>
      </tr>
      <tr>
        <td></td>
        <td><button>Login</button></td>
      </tr>
    </table>
  }
</body>
</html>

HomeController.cs 열기
Action,AuthPage 를 추가 합 니 다.

[Authorize]
[HttpGet]
public IActionResult AuthPage()
{
  return View();
}
AuthPage.cshtml 라 는 보기/홈 에 보 기 를 추가 합 니 다.

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
</head>
<body>
  <h1>Auth page</h1>

  <p>if you are not authorized, you can't visit this page.</p>
</body>
</html>
여기까지 기본 적 인 신분 인증 이 완료 되 었 습 니 다.핵심 로그 인 방법 은 다음 과 같 습 니 다.

await HttpContext.Authentication.SignInAsync("Cookie", userPrincipal, new AuthenticationProperties
{
  ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
  IsPersistent = false,
  AllowRefresh = false
});
다음 과 같은 인증 사용:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
  app.UseCookieAuthentication(new CookieAuthenticationOptions
  {
    AuthenticationScheme = "Cookie",
    LoginPath = new PathString("/Account/Login"),
    AccessDeniedPath = new PathString("/Account/Forbidden"),
    AutomaticAuthenticate = true,
    AutomaticChallenge = true
  });
}
컨트롤 러 나 Action 에[Author]를 추가 하면 로그 인 인증 이 필요 한 페이지 를 설정 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기