如何修改 WIF 的 ValidatingIssuerNameRegistry 以支持 Azure AD、ACS、Facebook、LiveID 和其他 IDP?



我有一个我想暴露于尽可能多的用户的应用程序。为此,我正在遵循此处解释的指示,以将我的应用程序连接到Azure Active Directory,以及将AAD连接到Azure ACS 2.0的这些指令的变体。

Azure ACS 2.0将处理所有联合域,以及Microsoft帐户(以前是LiveID或Passport)。它还将处理Facebook,Twitter和其他OAuth服务。

Azure Active Directory将处理Office 365,以及将其公司Active Directory同步到云的任何人。

我的家庭领域发现页面将在以下URL上发布a get,以确定是否应该使用LiveID或Azuread域。

https://login.microsoftonline.com/GetUserRealmExtended.srf?login=EMAIL@COMPANY.com 

或 http://odc.officeapps.live.com/odc/emailhrd/getIdp?hm=0&emailAddress=USERDRESS=USER%COMPANY.COM

如果不存在用户,我将使用与该公司联邦的Azure ACS。缺少这一点,用户将无法登录。

现在我解释了我的配置,我打算拥有Windows Identity Foundation(WIF)以允许ACS 2.0和ADF的身份验证。

问题

  • 我如何获得WIF 4.5,特别是验证的ISSUERNAMEREGISTRISTION以正确处理多个IDP的多个信任?

以下是VS2013随附的代码,将应用程序与Azure Active Directory联合使用。它回应了所有联邦请求,并做了我不了解的其他事情。有关此类的任何链接或信息都将是有帮助的

  public class DatabaseIssuerNameRegistry : ValidatingIssuerNameRegistry
  { 
    public static bool ContainsTenant(string tenantId)
    {
        using (TenantDbContext context = new TenantDbContext())
        {
            return context.Tenants
                .Where(tenant => tenant.Id == tenantId)
                .Any();
        }
    }
    public static bool ContainsKey(string thumbprint)
    {
        using (TenantDbContext context = new TenantDbContext())
        {
            return context.IssuingAuthorityKeys
                .Where(key => key.Id == thumbprint)
                .Any();
        }
    }
    public static void RefreshKeys(string metadataLocation)
    {
        IssuingAuthority issuingAuthority = ValidatingIssuerNameRegistry.GetIssuingAuthority(metadataLocation);
        bool newKeys = false;
        foreach (string thumbprint in issuingAuthority.Thumbprints)
        {
            if (!ContainsKey(thumbprint))
            {
                newKeys = true;
                break;
            }
        }
        if (newKeys)
        {
            using (TenantDbContext context = new TenantDbContext())
            {
                context.IssuingAuthorityKeys.RemoveRange(context.IssuingAuthorityKeys);
                foreach (string thumbprint in issuingAuthority.Thumbprints)
                {
                    context.IssuingAuthorityKeys.Add(new IssuingAuthorityKey { Id = thumbprint });
                }
                context.SaveChanges();
            }
        }
    }
    public static bool TryAddTenant(string tenantId, string signupToken)
    {
        if (!ContainsTenant(tenantId))
        {
            using (TenantDbContext context = new TenantDbContext())
            {
                SignupToken existingToken = context.SignupTokens.Where(token => token.Id == signupToken).FirstOrDefault();
                if (existingToken != null)
                {
                    context.SignupTokens.Remove(existingToken);
                    context.Tenants.Add(new Tenant { Id = tenantId });
                    context.SaveChanges();
                    return true;
                }
            }
        }
        return false;
    }
    public static void AddSignupToken(string signupToken, DateTimeOffset expirationTime)
    {
        using (TenantDbContext context = new TenantDbContext())
        {
            context.SignupTokens.Add(new SignupToken
            {
                Id = signupToken,
                ExpirationDate = expirationTime
            });
            context.SaveChanges();
        }
    }
    public static void CleanUpExpiredSignupTokens()
    {
        DateTimeOffset now = DateTimeOffset.UtcNow;
        using (TenantDbContext context = new TenantDbContext())
        {
            IQueryable<SignupToken> tokensToRemove = context.SignupTokens.Where(token => token.ExpirationDate <= now);
            if (tokensToRemove.Any())
            {
                context.SignupTokens.RemoveRange(tokensToRemove);
                context.SaveChanges();
            }
        }
    }
    protected override bool IsThumbprintValid(string thumbprint, string issuer)
    {
        string issuerID = issuer.TrimEnd('/').Split('/').Last();
        return ContainsTenant(issuerID) &&
            ContainsKey(thumbprint);
    }
}

vittorio bertocci在这篇文章中解释了数据库。

VS2013 RTM,组织帐户和发布到Windows Azure网站!

最重要的是,DatabaseIssuerNameRegistry只是基于实体框架的ValidatingIssuerNameRegistry web.config。它更灵活,如果/当管理机构更改它们时,则处理更新拇指。

相关内容

  • 没有找到相关文章

最新更新