使用SAML和Azure AD设置SSI的最佳方法

时间:2018-10-25 21:18:08

标签: saml saml-2.0 azure-ad-b2c

根据本文,给我的印象是,您可以使用SAML标准通过Azure AD对Web应用程序上的用户进行身份验证:

https://docs.microsoft.com/en-us/azure/active-directory/develop/single-sign-on-saml-protocol

但是,执行此操作所需的所有小步骤尚不完全清楚。因此,我走了一步,并做了以下步骤自己弄清楚了第一步,即获取服务提供商需要使用IdP(即Azure AD)重定向浏览器以进行身份​​验证的URL:

  • 我在免费层的Azure中设置了单独的广告。
  • 在该广告中,我创建了一个应用程序。
  • 应用程序中没有设置SSI的选项

然后,我使用以下代码为SAML浏览器请求生成URL:

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

namespace AzureSAMLExperiment
{
    class Program
    {
        // Call to https://login.microsoftonline.com/common/FederationMetadata/2007-06/FederationMetadata.xml returns the SingleSignOnService element below:

        public const string SingleSignOnServiceUrl = "https://login.microsoftonline.com/common/saml2";
        public const string SingleSignOnQueryString = "?SAMLRequest={0}";

        static void Main(string[] args)
        {
            // See https://docs.microsoft.com/en-us/azure/active-directory/develop/single-sign-on-saml-protocol
            var SAMLRequestXML = $@"<samlp:AuthnRequest
xmlns=""urn:oasis:names:tc:SAML:2.0:assertion""
ID=""id6c1c178c166d486687be4aaf5e482730""
Version=""2.0"" IssueInstant=""{DateTime.UtcNow.ToString("o")}""
xmlns:samlp=""urn:oasis:names:tc:SAML:2.0:protocol"">
<Issuer xmlns=""urn:oasis:names:tc:SAML:2.0:assertion"">ISSUER</Issuer>
</samlp:AuthnRequest>";

            var url = $"{SingleSignOnServiceUrl}?SAMLRequest={DeflateEncode(SAMLRequestXML)}";
        }

        private static string DeflateEncode(string val)
        {
            var memoryStream = new MemoryStream();
            using (var writer = new StreamWriter(new DeflateStream(memoryStream, CompressionMode.Compress, true), new UTF8Encoding(false)))
            {
                writer.Write(val);
                writer.Close();

                return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length, Base64FormattingOptions.None);
            }
        }
    }
}

然后将结果URL放入浏览器中。

我为ISSUER尝试了一些不同的值,包括

但是这些都不起作用。

如您所见,我使用的是公共URL,而不是特定于租户的URL。我不确定哪一个最好用。

在每种情况下,访问URL时,都会收到以下响应:

enter image description here

那么关于我做错了什么指示?

  • 我需要高级AD还是免费?
  • 我应该使用租户还是公共端点?
  • 我使用的XML或编码有问题吗?

2 个答案:

答案 0 :(得分:1)

Azure AD免费提供活动目录服务。要通过SAML协议连接到活动目录,您需要切换到付费计划。一旦您制定了付费计划并配置了SAML设置,Azure就会像SAML IdP(身份提供程序)一样工作。在这一点上,我建议您使用配置为SAML SP(服务提供商)的外部IAM服务来测试身份验证流,而不要自己设计解决方案。例如,您可以为此目的尝试Auth0 as SAML SP

使用上面的设置,架构将类似于这样;

Your App <= OAuth => Auth0 <= SAML => Azure AD

如果您不想为Azure的SAML支持付费,则可以使用WsFed协议将用户联合到Azure AD。这也是supported with Auth0

Your App <= OAuth => Auth0 <= WsFed => Azure AD

如果需要在应用程序内支持SAML协议,

This link对于 .Net 的某些链接可能会很有用,并且还提供了更多链接以提供更广阔的可能性。

免责声明:我为Auth0工作。

答案 1 :(得分:1)

是的,您需要Azure AD Premium。

这是使用自定义SAML连接的example

然后使用Azure AD /企业应用程序/ SSO。