C# WIF:如何指定在身份验证时返回哪些声明?

C# WIF:如何指定在身份验证时返回哪些声明?,c#,wif,claims-based-identity,C#,Wif,Claims Based Identity,与类似,只是我需要在身份验证时获得附加声明,而不是稍后 我正在将我的RP实现为另一个网站的身份验证插件,因此我不能(或者更愿意避免,如果可能的话)更改web.config文件或将FederationMetadata.xml添加到我的RP中 我已经成功地对STS进行了身份验证,现在除了它发送给我的基本信息之外,我还需要获得更多的索赔。STS是公共的(或在它附近),我无法控制,而且会有许多不同的RP对其进行认证,所以我不期望每个RP都会得到特殊的处理。因此,我假设在我执行身份验证之前,STS对我的R

与类似,只是我需要在身份验证时获得附加声明,而不是稍后

我正在将我的RP实现为另一个网站的身份验证插件,因此我不能(或者更愿意避免,如果可能的话)更改
web.config
文件或将
FederationMetadata.xml
添加到我的RP中

我已经成功地对STS进行了身份验证,现在除了它发送给我的基本信息之外,我还需要获得更多的索赔。STS是公共的(或在它附近),我无法控制,而且会有许多不同的RP对其进行认证,所以我不期望每个RP都会得到特殊的处理。因此,我假设在我执行身份验证之前,STS对我的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))));

通常,STS配置为提供索赔。配置基于每个RP,因此不同的RP可以获得不同的索赔

您可以使用WIF对其进行扩充

使用ClaimsAuthenticationManager并覆盖身份验证

然后是这样的:

((IClaimsIdentity)incomingPrincipal.Identity).Claims.Add(新索赔(…))


如果这些声明是外部的,你必须自己获取它们,例如访问广告?

是的,我也知道了。但事实证明还有一个参数-
fam.Request
fam.RequestPtr
,可用于传递特定索赔的请求。我用了它,它奏效了。不过我会接受你的回答,因为这是唯一的答案