我有一个我想暴露于尽可能多的用户的应用程序。为此,我正在遵循此处解释的指示,以将我的应用程序连接到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
。它更灵活,如果/当管理机构更改它们时,则处理更新拇指。