3

カスタム プリンシパル クラスを作成しました

public class FacebookPrincipal : ClaimsPrincipal
{
    public JObject Data { get; set; }
}

そして使いたい。ユーザーがログインすると、設定しようとしました

var fbP = new FacebookPrincipal { Data = user.Data };

Thread.CurrentPrincipal = fbP;
AuthenticationManager.User = fbP;
HttpContext.User = fbP;

設定した直後は機能しますが、行くhome/indexと値が失われます

var user = HttpContext.GetOwinContext().Authentication.User;
var bbbb = this.User;
var cccc = ClaimsPrincipal.Current;

上記のすべてのメソッドは型のプリンシパルを返しClaimsPrincipal、にキャストするとFacebookPrincipalnull が返されます。

カスタム プリンシパルを設定するにはどうすればよいですか?

4

3 に答える 3

3

ASP.NET Identity は、ユーザーとスレッドClaimsIdentityFactoryに割り当てる前に、デフォルトを使用して作成します。追加情報を追加または管理できるClaimsIdentity独自の場所を作成する必要があります。ClaimsIdentityFactory

UserManager<IdentityUser> userManager 
          = new UserManager<IdentityUser>(new UserStore<IdentityUser>());
userManager.ClaimsIdentityFactory 
          = new MyClaimsIdentityFactory<IdentityUser>();

そして、ClaimsIdentity またはそのサブクラスの実装を作成する次のコード。

public class MyClaimsIdentityFactory<IUser> : ClaimsIdentityFactory<IUser> where IUser : IdentityUser
{
    public MyClaimsIdentityFactory(): base()
    {

    }
    public override System.Threading.Tasks.Task<System.Security.Claims.ClaimsIdentity> CreateAsync(UserManager<IUser> manager, IUser user, string authenticationType)
    {
        // Override Creation of ClaimsIdentity and return it.
    }
}
  • ClaimsIdentity をサブクラス化する必要があることを確認してください。請求として追加情報を追加できます。
  • を使用して、作成した にbase.CreateAsyncマージClaimsしますClaimsIdentity
于 2013-11-04T10:58:24.927 に答える