与这个问题类似,除了我需要在身份验证时获得额外的声明,而不是稍后。
我正在将我的 RP 作为另一个网站的身份验证插件来实现,所以我不能(或者宁愿尽可能避免)做诸如更改web.config
文件或添加FederationMetadata.xml
到我的 RP 之类的事情。
我已经成功地对 STS 进行了身份验证,现在除了它发送给我的基本信息之外,我还需要获得更多声明。STS 是公开的(或附近),不受我的控制,并且会有许多不同的 RP 针对它进行身份验证,所以我不希望每个 RP 都会受到特殊待遇。因此,我假设 STS 在我执行身份验证之前对我的 RP 一无所知,并且在身份验证完成后它将忘记所有相关信息。
如前所述,我正在使用 WIF,并且我正在用代码做所有事情。我在哪里指定要发送哪些声明?到目前为止,这是我的代码:
// Init configuration
var config = new ServiceConfiguration();
config.AudienceRestriction.AllowedAudienceUris.Add(new Uri("https://MyAudienceURI/"));
config.CertificateValidator = System.IdentityModel.Selectors.X509CertificateValidator.None;
var issuers = new ConfigurationBasedIssuerNameRegistry();
issuers.AddTrustedIssuer("08F81147C44D95CDA617963AFF0650EF26578E4A", "http://STSIssuer/trust");
config.IssuerNameRegistry = issuers;
// Create the FAM
var fam = new WSFederationAuthenticationModule();
fam.ServiceConfiguration = config;
fam.PassiveRedirectEnabled = true;
fam.Issuer = "https://STSUrl/Default.aspx";
fam.Realm = "https://MyAudienceURI/";
fam.Reply = Request.Url.ToString();
fam.RequireHttps = false;
// Check the current request
var req = System.Web.HttpContext.Current.Request;
if (!fam.CanReadSignInResponse(req, true))
{
fam.RedirectToIdentityProvider("Nop.Plugin.ExternalAuth.WIF", Request.Url.ToString(), false);
Response.End();
}
var principal = ClaimsPrincipal.CreateFromIdentities(config.SecurityTokenHandlers.ValidateToken(fam.GetSecurityToken(fam.GetSignInResponseMessage(req))));