获取Azure的ACS页面需要进行被动身份验证的wctx参数

我支持一个作为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获取魔法字符串或makeHTTP 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.

点赞