准备标识服务器源代码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.v2中下载 thinktecture 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 解决方案资源管理器中,右键单击项目网站并选择“发布”。
在“配置文件”部分中,在下拉列表框中选择“ <新建...”> ,输入新的配置文件名称,然后按 “确定”。
在“连接”部分中,从“发布方法”下拉列表框中选择“文件系统”。
将“目标位置”文本框设置为要将网站发布到的位置。
在“设置”部分中,在“配置”下拉列表框中选择所需的配置。 默认情况下,配置为“发布”。
在“审阅”部分中查看设置,然后单击“ 发布 ”以发布网站。