gpt4 book ai didi

c# - 如何将从外部登录提供程序获取的有关用户的数据获取到他的 ClaimsIdentity 中?

转载 作者:行者123 更新时间:2023-11-30 12:43:12 25 4
gpt4 key购买 nike

我正在使用 Katana for OAuth 从他的 LinkedIn 个人资料中获取有关用户的数据。我想将从 LinkedIn 收到的所有数据放入用户的 ClaimsIdentity 对象中,这样我就可以将它发送到 ASP.NET 成员数据库中的 AspNetUserClaims 表。

我并没有完全迷路。我订阅了 LinkedInAuthenticationProvider 的 OnAuthenticated 事件,并将原始 JSON 反序列化为定制的业务对象。现在,我想从 ApplicationUserManager 访问这个对象,这样我就可以将它发送到数据库。这就是我被困的地方。

var options = new LinkedInAuthenticationOptions();
options.ClientId = "...";
options.ClientSecret = "...";
options.Provider = new LinkedInAuthenticationProvider
{
OnAuthenticated = (context) =>
{
// I would like to get this bespoke object
// of type LinkedInBasicProfileResponse
// into the UserManager<TUser, ...>
var basicProfile =
context.User.ToObject<LinkedInBasicProfileResponse>();

return Task.FromResult<object>(null);
}
};

app.UseLinkedInAuthentication(options);

我想在这里看到基本的配置文件对象:

public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this,
DefaultAuthenticationTypes.ApplicationCookie);

// Add custom user claims here
// I would like to add that data to these claims
var claims = userIdentity.Claims;

foreach(var claim in claims)
{
Debug.Print(string.Format($"{claim.Value}, {claim.ValueType}, {claim.Issuer}, {claim.OriginalIssuer}, {claim.Type}"));

foreach(var property in claim.Properties)
{
Debug.Print(string.Format($"{property.Key}, {property.Value}"));
}
}

return userIdentity;
}
}

当然,一种方法是将其放入 HttpSessionState 字典中。但我希望有一种更优雅的方式来做到这一点。

最佳答案

在您的代码中调用 CreateIdentityAsync 后,您只需在 userIdentity 上使用 AddClaim 方法,如下所示:

userIdentity.AddClaim(new Claim("FavouriteDrink", "Beer"));

完整代码将变为:

public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this,
DefaultAuthenticationTypes.ApplicationCookie);

// Add custom claim
userIdentity.AddClaim(new Claim("FavouriteDrink", "Beer"));
var claims = userIdentity.Claims;

foreach(var claim in claims)
{
Debug.Print(string.Format($"{claim.Value}, {claim.ValueType}, {claim.Issuer}, {claim.OriginalIssuer}, {claim.Type}"));

foreach(var property in claim.Properties)
{
Debug.Print(string.Format($"{property.Key}, {property.Value}"));
}
}

return userIdentity;
}
}

关于c# - 如何将从外部登录提供程序获取的有关用户的数据获取到他的 ClaimsIdentity 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31880272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com