我支持一个作为IDP和STS的解决方案.将其视为MVC应用程序,对本地存储的配置文件进行简单的身份验证.我想在我的一个页面上放置一个链接,当单击它时,构建SAML有效负载并通过ACS发送,然后发送到合作伙伴的站点(后者又使用WIF从ACS读取传入的SAML2有效负载).我不想在旅程中显示另一个登录页面(例如ACS的主域发现页面),因为当他们点击我的链接时,他们已经过身份验证.我只是想向目的地依赖方网址发送声明,我想在那里通过ACS.
ACS通过“自定义登录页面”支持与此相近的内容.您可以下载一个HTML页面,您可能会定制并在IDP上托管,并让用户在前往依赖方时点击进入. HTML文件源自ACS托管的Javascript文件(IdentityProviders.js),该文件将LoginUrl作为其吸收的JSON参数之一提供. LoginUrl包含一个wctx参数(看起来是加密的或其他东西)我复制然后像这样使用:
private SignInRequestMessage GetSignInRequestMessage() {
SignInRequestMessage aMessage = new SignInRequestMessage(new Uri("https://something.accesscontrol.windows.net/"), "http://accesscontrol.windows.net/");
aMessage.Reply = "http://locohost:65447/Home/SAML";
aMessage.Realm = "https://something.accesscontrol.windows.net/v2/wsfederation";
aMessage.Context = THE_WCTX_PARAM_I_GRABBED;
return aMessage;
}
最终结果是我的链接点击一直带到依赖方内的登录页面(在这种情况下为http:// locohost:65447 / Home / SAML),通过ACS允许声明映射和过滤,签名和加密支持.
我注意到当我在相应的依赖方中更改返回URL时,wctx值只是略有改变.我的猜测是它包含领域和返回URL,但我不明白它为什么需要它,因为我可以通过编程方式提供这些数据位,如上所示.我的目标是能够以编程方式构建该wctx参数,而无需在runtime获取魔法字符串或make和HTTP call.任何人都可以提供建议吗?
编辑:这是一张概述所需流程的图像.帐户存储在合作伙伴中,而不是Azure Active Directory中
这里有更多的伪代码,显示了我如何使用wctx参数将表单发布到ACS
public async Task<string> DoACSSAMLPost(List<Claim> aClaimsList, ClaimsPrincipal aPrincipal, string aTokenServiceUrl) {
// SignInRequestMessage is what is sent to ACS (see code sample above)
SignInRequestMessage aSignInRequestMessage = await GetSignInRequestMessage();
// sign request with private key. Public key has been installed in ACS.
X509SigningCredentials aSigningCredentials = new X509SigningCredentials(theSigningCertificate);
// configuration allows the token service to sign request and identifies itself as the token service
SecurityTokenServiceConfiguration aConfig = new SecurityTokenServiceConfiguration(aTokenServiceUrl, aSigningCredentials);
CustomSecurityTokenService aSecurityTokenService = new CustomSecurityTokenService(aConfig, aClaimsList);
// Message is generated by the System.IdentityModel plumbing
SignInResponseMessage aResponseMessage = FederatedPassiveSecurityTokenServiceOperations.ProcessSignInRequest(aSignInRequestMessage, aPrincipal, aSecurityTokenService);
// and the form post HTML is returned
return aResponseMessage.WriteFormPost();
}
我可以从IdentityProvider.js中获取这个参数并在运行中构建所有这些参数,但我想了解a)如果我的方法有意义并且是“正确”的方法来解决这个问题,并且b)如果有更好的方法获取该wctx参数的方法(或者,如果我不更改ACS中依赖方配置中的返回URL,我可以在本地缓存它)
最佳答案 不确定我是否100%意图.您是否尝试跳过HRD,因此身份验证直接进入所选的IdP?如果是这种情况,您只需在请求中向ACS注入“?whr = issuername”即可.您甚至可以将原始请求发送给RP,并提取&在redirectingtoidentityprovider事件中传递它.
您不应该弄乱wctx参数,因为它的目标是在各种重定向中保持状态 – 但这看起来并不像这里的目标.
HTH
V.