ID 서버 소스 코드 Project 준비
적용 대상: Windows Azure Pack
thinktecture Identity Server Visual Studio 프로젝트를 준비하려면 GitHub 프로젝트 소스 코드를 다운로드하여 올바른 NuGet 패키지가 설치되었는지 확인하고 소스 코드에 필요한 업데이트를 수행해야 합니다.
원래 thinktecture Identity Server 소스 코드는 Windows Azure Pack에서 작동하려면 두 가지 업데이트가 필요합니다. 첫 번째 변경은 새 클레임 "upn" 값을 추가하고 두 번째 변경은 최소 서명 인증서 요구 사항을 충족하는 값을 추가합니다.
마지막으로 솔루션 웹 사이트를 원하는 대상에 게시해야 합니다.
Visual Studio 솔루션 준비
Thinktecture Identity Server Visual Studio 솔루션을 준비하려면
에서 https://github.com/thinktecture/Thinktecture.IdentityServer.v2thinktecture Visual Studio Project 다운로드합니다.
Visual Studio 2012에서 thinktecture Identity Server 솔루션 열기
솔루션 탐색기 'Thinktecture.IdentityServer' 솔루션을 마우스 오른쪽 단추로 클릭하고 솔루션에 대한 NuGet 패키지 관리를 선택하여 NuGet 패키지 관리 대화 상자를 엽니다.
복원 단추를 선택하여 누락된 NuGet 패키지를 복원합니다.
업데이트 선택하고 필요한 업데이트를 설치합니다.
Thinktecture.IdentityServer 솔루션을 빌드합니다.
새 클레임 "upn" 값 추가
Windows Azure Pack을 올바르게 사용하려면 새 "upn" 값을 thinktecture Identity Serveer 소스 코드에 추가해야 합니다.
새 클레임 "upn" 값을 추가하려면
솔루션 Thinktecture.IdentityServer에서 \Libraries\Thinktecture.IdentityServer.core\TokenService에서 TokenService.cs 파일을 엽니다.
GetExternalOutputClaims 함수에서 다음 코드를 찾습니다.
id.AddClaim(new Claim(Constants.Claims.IdentityProvider, idp.Name));
그 직후에 다음 코드를 배치합니다.
var emailaddress = id.Claims.Single(c => c.Type == ClaimTypes.Email); id.AddClaim(new Claim("upn", emailaddress.Value));
솔루션을 빌드하고 오류를 수정합니다.
이제 코드 섹션은 다음과 같이 표시됩니다.
protected virtual ClaimsIdentity GetExternalOutputClaims(ClaimsPrincipal principal, RequestDetails requestDetails)
{
var idpClaim = principal.FindFirst(c => c.Type == Constants.Claims.IdentityProvider && c.Issuer == Constants.InternalIssuer);
if (idpClaim == null)
{
throw new InvalidOperationException("No identity provider claim found.");
}
IdentityProvider idp = null;
if (IdentityProviderRepository.TryGet(idpClaim.Value, out idp))
{
var transformedClaims = ClaimsTransformationRulesRepository.ProcessClaims(SanitizeInternalClaims(principal), idp, requestDetails);
var id = new ClaimsIdentity(transformedClaims, "External");
id.AddClaim(new Claim(Constants.Claims.IdentityProvider, idp.Name));
var emailaddress = id.Claims.Single(c => c.Type == ClaimTypes.Email);
id.AddClaim(new Claim("upn", emailaddress.Value));
return id;
}
throw new InvalidRequestException("Invalid identity provider.");
}
최소 서명 인증서 요구 사항 충족
서명 인증서 요구 사항은 Windows Azure Pack에서 올바르게 작동하도록 업데이트해야 합니다.
최소 서명 인증서 요구 사항을 충족하려면
솔루션 Thinktecture.IdentityServer에서 \WebSite\Global.asax에서 Global.asax.cs 파일을 엽니다.
파일 맨 위에 다음 using 문을 추가합니다.
using System.IdentityModel.Tokens; using System.Reflection;
MvcApplication 클래스의 끝에 다음 함수를 추가합니다.
private void HijackMinimumSigningCertificateRequirements() { var _type = typeof(SignatureProviderFactory); var _minimumAsymmetricKeySizeInBitsForSigning = _type.GetField("_minimumAsymmetricKeySizeInBitsForSigning", BindingFlags.NonPublic | BindingFlags.Static); _minimumAsymmetricKeySizeInBitsForSigning.SetValue(null, 1024u); }
다음 코드를 사용하여 새 함수에 대한 호출을 Application_Start() 메서드의 끝으로 추가합니다.
HijackMinimumSigningCertificateRequirements();
솔루션을 빌드하고 오류를 수정합니다.
완료된 코드는 다음과 같이 표시됩니다.
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Data.Entity;
using System.Security.Claims;
using System.Web.Helpers;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Thinktecture.IdentityServer.Repositories;
using Thinktecture.IdentityServer.Repositories.Sql;
using System.IdentityModel.Tokens;
using System.Reflection;
namespace Thinktecture.IdentityServer.Web
{
public class MvcApplication : System.Web.HttpApplication
{
[Import]
public IConfigurationRepository ConfigurationRepository { get; set; }
[Import]
public IUserRepository UserRepository { get; set; }
[Import]
public IRelyingPartyRepository RelyingPartyRepository { get; set; }
protected void Application_Start()
{
// create empty config database if it not exists
Database.SetInitializer(new ConfigurationDatabaseInitializer());
// set the anti CSRF for name (that's a unqiue claim in our system)
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;
// setup MEF
SetupCompositionContainer();
Container.Current.SatisfyImportsOnce(this);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, ConfigurationRepository);
RouteConfig.RegisterRoutes(RouteTable.Routes, ConfigurationRepository, UserRepository);
ProtocolConfig.RegisterProtocols(GlobalConfiguration.Configuration, RouteTable.Routes, ConfigurationRepository, UserRepository, RelyingPartyRepository);
BundleConfig.RegisterBundles(BundleTable.Bundles);
HijackMinimumSigningCertificateRequirements();
}
private void SetupCompositionContainer()
{
Container.Current = new CompositionContainer(new RepositoryExportProvider());
}
private void HijackMinimumSigningCertificateRequirements()
{
var _type = typeof(SignatureProviderFactory);
var _minimumAsymmetricKeySizeInBitsForSigning = _type.GetField("_minimumAsymmetricKeySizeInBitsForSigning", BindingFlags.NonPublic | BindingFlags.Static);
_minimumAsymmetricKeySizeInBitsForSigning.SetValue(null, 1024u);
}
}
}
웹 사이트 코드 게시
솔루션이 성공적으로 컴파일되면 웹 사이트 코드를 로컬 파일 시스템에 게시하거나 실행할 서버에 게시할 수 있습니다. 다음 단계에서는 로컬 파일 시스템에 게시하는 방법을 보여 줍니다.
로컬 파일 시스템에 게시하려면
Visual Studio 솔루션 탐색기 프로젝트 WebSite를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.
프로필 섹션에서 드롭다운 목록 상자에서 새로 만들기를> 선택하고< 새 프로필 이름을 입력하고 확인을 누릅니다.
연결 섹션의 게시 메서드 드롭다운 목록 상자에서 파일 시스템을 선택합니다.
대상 위치 텍스트 상자를 사이트를 게시할 위치로 설정합니다.
설정 섹션에서 구성 드롭다운 목록 상자에서 원하는 구성을 선택합니다. 기본적으로 구성은 릴리스입니다.
검토 섹션에서 설정을 검토하고 게시 를 클릭하여 웹 사이트를 게시합니다.