准备标识服务器源代码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 解决方案

  1. https://github.com/thinktecture/Thinktecture.IdentityServer.v2中下载 thinktecture Visual Studio Project。

  2. 在 Visual Studio 2012 中打开 thinktecture Identity Server 解决方案

  3. 在解决方案资源管理器中,右键单击“Thinktecture.IdentityServer”解决方案,然后选择“管理解决方案的NuGet包”以打开“管理NuGet包”对话框。

  4. 选择“还原”按钮以还原任何缺少的NuGet包。

  5. 选择更新并安装任何必需的更新。

  6. 生成 Thinktecture.IdentityServer 解决方案。

添加新声明“upn”值

若要正确使用 Windows Azure Pack,必须将新的“upn”值添加到 thinktecture Identity Serveer 源代码中。

添加新声明“upn”值

  1. 在解决方案 Thinktecture.IdentityServer 中,打开 \Libraries\Thinktecture.IdentityServer.core\TokenService 中的 TokenService.cs 文件。

  2. 在函数 GetExternalOutputClaims 中,找到以下代码:

    id.AddClaim(new Claim(Constants.Claims.IdentityProvider, idp.Name));
    
  3. 之后立即放置以下代码:

    var emailaddress = id.Claims.Single(c => c.Type == ClaimTypes.Email);
    id.AddClaim(new Claim("upn", emailaddress.Value));
    
  4. 生成解决方案并更正任何错误。

现在,代码部分应如下所示:

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。

满足最低签名证书要求

  1. 在解决方案 Thinktecture.IdentityServer 中,在 \WebSite\Global.asax 中打开文件 Global.asax.cs

  2. 在文件顶部添加以下 using 语句:

    using System.IdentityModel.Tokens;
    using System.Reflection;
    
  3. 在类 MvcApplication 的末尾添加以下函数。

    private void HijackMinimumSigningCertificateRequirements()
            {
                var _type = typeof(SignatureProviderFactory);
                var _minimumAsymmetricKeySizeInBitsForSigning = _type.GetField("_minimumAsymmetricKeySizeInBitsForSigning", BindingFlags.NonPublic | BindingFlags.Static);
                _minimumAsymmetricKeySizeInBitsForSigning.SetValue(null, 1024u);
            }
    
  4. 使用以下代码添加对新函数的调用作为 Application_Start () 方法的末尾:

    HijackMinimumSigningCertificateRequirements();
    
  5. 生成解决方案并更正任何错误。

完成的代码应如下所示:

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);

        }

    }
}

发布网站代码

成功编译解决方案后,可以将网站代码发布到本地文件系统,或将其发布到运行它的服务器。 以下步骤演示如何发布到本地文件系统

发布到本地文件系统

  1. 在Visual Studio 解决方案资源管理器中,右键单击项目网站并选择“发布”。

  2. 在“配置文件”部分中,在下拉列表框中选择“ <新建...”> ,输入新的配置文件名称,然后按 “确定”。

  3. 在“连接”部分中,从“发布方法”下拉列表框中选择“文件系统”。

  4. 将“目标位置”文本框设置为要将网站发布到的位置。

  5. 在“设置”部分中,在“配置”下拉列表框中选择所需的配置。 默认情况下,配置为“发布”。

  6. 在“审阅”部分中查看设置,然后单击“ 发布 ”以发布网站。

另请参阅

Windows Azure Pack 第三方标识提供者