.NET Core Identity Server 4 인증 VS ID 인증
ASP.NET Core에서 인증을 수행하는 올바른 방법을 이해하려고 합니다.여러 리소스(대부분 오래된 리소스)를 살펴보았습니다.
어떤 사람들은 Azure AD와 같은 클라우드 기반 솔루션을 사용하거나 IdentityServer4를 사용하여 나만의 토큰 서버를 호스팅하도록 하는 대안적인 솔루션을 제공합니다.
의 이전 버전에서.가장 간단한 인증 형식 중 하나는 사용자 정의 I 원칙을 만들고 내부에 추가 인증 사용자 데이터를 저장하는 것입니다.
public interface ICustomPrincipal : System.Security.Principal.IPrincipal
{
string FirstName { get; set; }
string LastName { get; set; }
}
public class CustomPrincipal : ICustomPrincipal
{
public IIdentity Identity { get; private set; }
public CustomPrincipal(string username)
{
this.Identity = new GenericIdentity(username);
}
public bool IsInRole(string role)
{
return Identity != null && Identity.IsAuthenticated &&
!string.IsNullOrWhiteSpace(role) && Roles.IsUserInRole(Identity.Name, role);
}
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get { return FirstName + " " + LastName; } }
}
public class CustomPrincipalSerializedModel
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
그런 다음 데이터를 쿠키에 직렬화하여 클라이언트에 반환합니다.
public void CreateAuthenticationTicket(string username) {
var authUser = Repository.Find(u => u.Username == username);
CustomPrincipalSerializedModel serializeModel = new CustomPrincipalSerializedModel();
serializeModel.FirstName = authUser.FirstName;
serializeModel.LastName = authUser.LastName;
JavaScriptSerializer serializer = new JavaScriptSerializer();
string userData = serializer.Serialize(serializeModel);
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,username,DateTime.Now,DateTime.Now.AddHours(8),false,userData);
string encTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
Response.Cookies.Add(faCookie);
}
제 질문은 다음과 같습니다.
의 이전 버전에서 수행된 방법과 유사한 인증 방법을 사용하려면 어떻게 해야 합니다.Net은 이전 방식이 여전히 작동하거나 최신 버전이 있는지 확인합니다.
자신만의 토큰 서버 절을 사용하여 자신만의 사용자 정의 원칙을 만들 경우의 장점과 단점은 무엇입니까?
클라우드 기반 솔루션 또는 별도의 토큰 서버를 사용할 때 현재 애플리케이션과 통합하려면 어떻게 해야 합니까? 애플리케이션에 사용자 테이블이 필요합니다. 둘을 어떻게 연결하시겠습니까?
다양한 솔루션이 있기 때문에 엔터프라이즈 애플리케이션을 생성하여 Gmail/Facebook을 통한 로그인을 허용하는 동시에 다른 SSO로 확장할 수 있습니다.
- 이러한 기술의 간단한 구현에는 어떤 것이 있습니까?
TL;DR
IdentityServer = OAuth 2.0/OpenId-Connect를 통한 토큰 암호화 및 검증 서비스
ASP.NET ID = ASP.NET의 현재 ID 관리 전략
의 이전 버전에서 수행된 방법과 유사한 인증 방법을 사용하려면 어떻게 해야 합니다.Net은 이전 방식이 여전히 작동하거나 최신 버전이 있는지 확인합니다.
ASP.NET Core에서 기존 방식을 달성하지 못한 이유는 알 수 없지만 일반적으로 이러한 전략은 ASP.NET Identity로 대체되었으며 ASP.NET Identity는 ASP.NET Core에서 잘 유지되고 있습니다.
https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity
ASP.NET Identity는 SQL Server와 같은 백업 저장소를 사용하여 사용자 이름, 암호(해시), 전자 메일, 전화 등의 사용자 정보를 저장하고 FirstName, LastName 또는 기타 항목을 저장하도록 쉽게 확장할 수 있습니다.따라서 사용자 정보를 쿠키로 암호화하여 클라이언트에서 서버로 주고받을 이유가 없습니다.사용자 클레임, 사용자 토큰, 사용자 역할 및 외부 로그인과 같은 개념을 지원합니다.ASP.NET Identity의 엔티티는 다음과 같습니다.
- AsNet 사용자
- AsNet 사용자 역할
- AsNet 사용자 클레임
- AsNetUserLogins(Google, AAD와 같은 외부 ID 공급자 연결용)
- AsNetUserTokens(사용자가 수집한 access_token 및 refresh_token 등을 저장하기 위한)
자신만의 토큰 서버 절을 사용하여 자신만의 사용자 정의 원칙을 만들 경우의 장점과 단점은 무엇입니까?
토큰 서버는 인증 및/또는 인증 정보를 포함하는 간단한 데이터 구조를 생성하는 시스템입니다.인증은 일반적으로 access_token이라는 이름의 토큰의 for를 사용합니다.이것이 "집으로 가는 열쇠"가 될 것입니다. 말하자면, 문을 통과하여 보호된 자원, 보통 웹 API의 거주지로 들어갈 수 있게 해줍니다.인증의 경우id_token사용자/사용자의 고유 식별자를 포함합니다.access_token에 이러한 식별자를 넣는 것이 일반적이지만, 이제는 OpenID-Connect라는 전용 프로토콜이 있습니다.
자체 STS(Security Token Service)를 보유하는 이유는 암호화를 통해 정보 자산을 보호하고 이러한 리소스에 액세스할 수 있는 클라이언트(애플리케이션)를 제어하기 위한 것입니다.게다가, 신원 관리를 위한 표준은 현재 Open에 존재합니다.ID-연결 사양입니다.IdentityServer는 Open과 결합된 OAuth 2.0 AuthorizationServer의 예입니다.ID 연결 인증 서버입니다.
그러나 응용프로그램에 사용자 테이블만 있는 경우에는 이 작업이 필요하지 않습니다.토큰 서버가 필요하지 않습니다. ASP.NET Identity만 사용하면 됩니다. ASP.NET Identity는 사용자를 서버의 ClaimsIdentity 개체에 매핑하므로 사용자 지정 IP Principal 클래스가 필요하지 않습니다.
클라우드 기반 솔루션 또는 별도의 토큰 서버를 사용할 때 현재 애플리케이션과 통합하려면 어떻게 해야 합니까? 애플리케이션에 사용자 테이블이 필요합니다. 둘을 어떻게 연결하시겠습니까?
별도의 ID 솔루션을 애플리케이션과 통합하는 방법은 다음 튜토리얼을 참조하십시오. https://identityserver4.readthedocs.io/en/latest/quickstarts/0_overview.html https://auth0.com/docs/quickstart/webapp/aspnet-core
적어도 사용자 이름을 외부 공급자의 사용자 ID에 매핑하는 두 개의 열 테이블이 필요합니다.이것은 ASP.NET Identity에서 AsNetUserLogins 테이블이 수행하는 작업입니다.그러나 해당 테이블의 행은 AsNetUsers의 사용자 레코드가 되는 것에 따라 달라집니다.
ASP.NET Identity는 Google, Microsoft, Facebook 및 모든 Open과 같은 외부 공급자를 지원합니다.ID-Connect 제공업체인 Azure AD가 이미 있습니다. (구글과 마이크로소프트는 이미 Open을 구현했습니다.)ID-Connect 프로토콜을 사용하면 이와 같은 사용자 정의 통합 패키지도 필요하지 않습니다.또한 ADFS는 아직 ASP.NET Core Identity에서 사용할 수 없습니다.
ASP.NET Identity의 외부 공급자와 함께 시작하려면 다음 문서를 참조하십시오.
https://learn.microsoft.com/en-us/aspnet/core/security/authentication/social/
다양한 솔루션이 있기 때문에 엔터프라이즈 애플리케이션을 생성하여 Gmail/Facebook을 통한 로그인을 허용하는 동시에 다른 SSO로 확장할 수 있습니다.
위에서 설명한 것처럼 ASP.NET Identity는 이미 이 작업을 수행합니다.외부 로그인 프로세스에서 "외부 공급자" 테이블과 데이터 드라이브를 만드는 것은 매우 쉽습니다.따라서 새로운 "SSO"가 제공될 때 공급자의 URL, 클라이언트 ID 및 이들이 제공하는 비밀 정보와 같은 속성을 가진 새 행을 추가하면 됩니다. ASP.NET Identity에는 이미 Visual Studio 템플릿에 UI가 내장되어 있지만 더 시원한 단추는 소셜 로그인을 참조하십시오.
요약
암호 로그인 기능과 사용자 프로필이 있는 사용자 테이블만 있으면 ASP.NET Identity가 완벽합니다.외부 기관을 포함할 필요가 없습니다.그러나 많은 아피스에 액세스해야 하는 애플리케이션이 많은 경우, 신원을 보호하고 검증하고 토큰에 액세스할 수 있는 독립적인 권한이 필요합니다.Identity Server가 적합하거나, openiddict-core 또는 클라우드 솔루션의 Auth0을 참조하십시오.
제가 사과드릴 것은 이것이 정확하지 않거나 너무 소개적인 것이라면 입니다.원하는 소의 눈을 찾으려면 자유롭게 대화하십시오.
부록:쿠키 인증
쿠키를 사용하여 맨본 인증을 수행하려면 다음 단계를 수행합니다.하지만 제가 알기로는 관세 청구 교장은 지원되지 않습니다.효과를 는 동한효얻의면목활다용니합록을클일레의 하세요.ClaimPrincipal물건.
Visual Studio 2015/2017에서 "인증 없음"을 선택하여 새 ASP.NET Core 1.1 웹 응용 프로그램을 만듭니다.그런 다음 패키지 추가:
Microsoft.AspNetCore.Authentication.Cookies
▁ 아래에서Configure.Startup.cs(으)ㄹ 앞에.app.UseMvc):
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "MyCookieMiddlewareInstance",
LoginPath = new PathString("/Controller/Login/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
그런 다음 로그인 UI를 만들고 다음과 같이 HTML 양식을 작업 방법에 게시합니다.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(String username, String password, String returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
// check user's password hash in database
// retrieve user info
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, username),
new Claim("FirstName", "Alice"),
new Claim("LastName", "Smith")
};
var identity = new ClaimsIdentity(claims, "Password");
var principal = new ClaimsPrincipal(identity);
await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);
return RedirectToLocal(returnUrl);
}
ModelState.AddModelError(String.Empty, "Invalid login attempt.");
return View();
}
HttpContext입니다.사용자 개체에는 사용자 지정 클레임이 있어야 하며 클레임 주체의 목록 컬렉션을 쉽게 검색할 수 있습니다.
StackOverflow 게시물에는 전체 솔루션/프로젝트가 다소 많은 것처럼 보이기 때문에 이것으로 충분하기를 바랍니다.
TL;DR
IdentityServer4를 올바르게 구현하는 방법에 대한 전체 게시물을 보여주고 싶지만 모든 텍스트를 에 맞추려고 했지만 StackOverflow가 수락하는 범위를 벗어났기 때문에 대신 몇 가지 팁과 배운 내용을 수정하겠습니다.
토큰 서버와 ASP ID를 사용할 경우의 이점은 무엇입니까?
토큰 서버는 많은 이점이 있지만 모두에게 적합한 것은 아닙니다.여러 클라이언트가 로그인할 수 있도록 하는 엔터프라이즈와 같은 솔루션을 구현하는 경우 토큰 서버를 사용하는 것이 최선이지만, 외부 로그인을 지원하는 간단한 웹 사이트를 만드는 것만으로도 ASP ID 및 일부 미들웨어를 사용할 수 있습니다.
ID 서버 4 팁
ID 서버 4는 제가 본 많은 다른 프레임워크에 비해 상당히 잘 문서화되어 있지만 처음부터 시작하여 전체 그림을 보는 것은 어렵습니다.
첫 번째 실수는 인증으로 OAuth를 사용하려고 한 것입니다. 예, 그렇게 하는 방법이 있지만 OAuth는 인증이 아닌 인증을 위한 것입니다. OpenIdConnect(OIDC)를 사용하려면 인증을 사용하십시오.
저의 경우 웹 API에 연결하는 Javascript 클라이언트를 만들고 싶었습니다.많은 솔루션을 살펴보았지만 처음에는 Webapi를 사용하여 Authenticate against Identity Server를 호출하려고 했습니다. 서버에 대해 검증되었기 때문에 토큰이 유지되도록 하려고 했습니다.그 흐름은 잠재적으로 작동할 수 있지만 결점이 많습니다.
마지막으로 자바스크립트 클라이언트 샘플을 찾았을 때 적절한 흐름을 얻었습니다.클라이언트가 로그인하고 토큰을 설정합니다.그런 다음 웹 API가 OIdc Client를 사용하도록 하여 IdentityServer에 대한 액세스 토큰을 확인합니다.
상점 및 마이그레이션에 연결하여 처음에는 마이그레이션과 관련하여 몇 가지 오해가 있었습니다.마이그레이션을 실행하면 구성된 컨텍스트를 사용하여 SQL을 만드는 방법을 알아내는 대신 내부적으로 dll에서 SQL을 생성한 것 같습니다.
컴퓨터에서 사용하는 마이그레이션 구문이 중요하다는 것을 아는 마이그레이션에는 두 가지 구문이 있습니다.
dotnet ef migrations add InitialIdentityServerMigration -c ApplicationDbContext
Add-Migration InitialIdentityServerDbMigration -c ApplicationDbContext
마이그레이션 후 매개 변수는 이름입니다. 이름이 필요한 이유는 확실하지 않습니다.ApplicationDbContext작성할 코드 우선 DB 컨텍스트입니다.
마이그레이션은 자동 마법을 사용하여 시작 구성 방식에서 연결 문자열을 찾습니다. 서버 탐색기의 연결을 사용한 것으로 가정했습니다.
프로젝트가 여러 개인 경우 ApplicationDbContext가 시작으로 설정된 프로젝트가 있는지 확인합니다.
권한 부여와 인증을 구현할 때 움직이는 부분이 많은데, 이 게시물이 누군가에게 도움이 되길 바랍니다.인증을 완벽하게 이해하는 가장 쉬운 방법은 인증 예제를 분리하여 모든 내용을 정리하고 설명서를 반드시 읽어보는 것입니다.
ASP.NET ID - 베어러 인증이든 기본 인증이든 응용 프로그램을 인증하기 위한 빌드이며 사용자 등록, 로그인, 암호 변경 등을 수행할 수 있는 미리 만들어진 코드를 제공합니다.
이제 10개의 다른 애플리케이션이 있지만 10개의 애플리케이션 모두에서 동일한 작업을 수행하는 것은 불가능하다고 가정해 보겠습니다.아주 연약하고 아주 나쁜 관행.
이 문제를 해결하기 위해 우리가 할 수 있는 것은 인증과 권한을 중앙 집중화하여 이와 관련된 어떠한 변경도 우리의 10개 앱 모두에 영향을 미치지 않도록 하는 것입니다.
ID 서버는 동일한 기능을 제공합니다.우리는 아이덴티티 서비스로 사용된 하나의 샘플 웹 앱을 만들 수 있고 그것은 당신의 사용자를 검증하고 JWT 액세스 토큰을 제공할 것입니다.
저는 항상 기본 제공 ASP.NET Identity(및 이전의 Membership) 인증/인증을 사용해 왔으며 최근에 Auth0(https://auth0.com )을 구현했으며 이를 다른 시도로 추천합니다.
소셜 로그인은 Identity로 구현하는 것이 어렵지는 않지만 관련된 초기 설정이 있으며 문서에서 온라인으로 찾은 단계가 동일하지 않은 경우가 있습니다. 일반적으로 소셜 로그인을 설정하려는 플랫폼의 개발자 섹션에서 이에 대한 도움말을 찾을 수 있습니다.ID는 .net 프레임워크의 레거시 버전에 있는 이전 멤버 자격 기능을 대체한 것입니다.제가 놀라운 것은 이미 가지고 있는 jwt 토큰을 웹 api에 전달하는 것과 같은 에지 사용 사례는 다중 사이트에서도 온라인 예제의 어느 곳에서도 다루어지지 않는다는 것입니다.이 작업을 수행하기 위해 자체 토큰 권한이 필요하지는 않지만 자체 호스팅 서버를 처리하지 않는 get 또는 post에서 데이터를 전달하는 방법에 대한 예는 하나도 찾을 수 없습니다.
언급URL : https://stackoverflow.com/questions/42121854/net-core-identity-server-4-authentication-vs-identity-authentication
'programing' 카테고리의 다른 글
| VBA를 사용하여 Excel 파일에서 jpg로 사진 내보내기 (0) | 2023.07.03 |
|---|---|
| SSMS 버전 18 – 데이터베이스 다이어그램 없음 (0) | 2023.07.03 |
| "ES5가 아닌 클래스에서 getInternalNameOfClass()를 호출하는 동안 오류가 발생했습니다. AngularFireModule에 내부 클래스 선언이 있어야 합니다." (0) | 2023.07.03 |
| 서로 다른 두 파일 간의 git diff (0) | 2023.07.03 |
| bash 스크립트 내에서 SQL을 어떻게 실행합니까? (0) | 2023.06.28 |