1

ADFS を介してサード パーティに対して認証を行う asp.net アプリケーションがあります。認証が成功すると、ユーザーは、ユーザーのクレームがデータベースから取得されるランディング ページにリダイレクトされます。次のコードを使用して、ユーザーのクレームを入力します。

IClaimsPrincipal principal = Thread.CurrentPrincipal as IClaimsPrincipal;
IClaimsIdentity claimsIdentity = (IClaimsIdentity)principal.Identity;

foreach (string claim in customClaims)
{
  Claim newClaim = new Claim(ClaimTypes.Role, claim);                
  claimsIdentity.Claims.Add(newClaim);
}

クレームを設定したら、IClaimsPrincipal をセッションに保存します。ここで物事が奇妙になります。ユーザーがランディング ページから目的のページにリダイレクトされた後、クレームが失われます。次のコードを使用してクレームを照会すると...

IClaimsPrincipal principal= Thread.CurrentPrincipal as IClaimsPrincipal;
IClaimsIdentity claimsIdentity = (IClaimsIdentity)principal.Identity;

foreach (Claim claim in claimsIdentity.Claims)
{
  Response.Write(claim.ClaimType + ": " + claim.Value + "<br/>");
}

...追加されたクレームは返されません。代わりに、ADFS (ユーザー名) から与えられた元の要求のみを持っています。奇妙なことに、セッションから IClaimsPrincipal を取り出して、それがクレームのコレクションであるとクエリを実行すると、追加したすべてのクレームが返されます。ここで何が起こっているのですか?

4

2 に答える 2

1

クレームを追加した後、セッション Cookie を更新してみてください。例:

var user = HttpContext.User as ClaimsPrincipal;
var claims = new List<Claim>();

claims.Add(new Claim("MyClaimType", "MyClaimValue"));
user.AddIdentity(new ClaimsIdentity(claims));

// Update cookie 
var sam = FederatedAuthentication.SessionAuthenticationModule; 

if (sam != null) 
{ 
  var token = new SessionSecurityToken(user); 
  sam.WriteSessionTokenToCookie(token); 
}

ClaimsAuthorizationManager などの「WIF​​ 制御」メソッドの外部でクレームを操作する場合は、認証セッション Cookie を手動で更新する必要があります。そうしないと、すべての変更が失われます。

于 2013-09-22T21:38:44.160 に答える