首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查用户是否使用社交媒体进行身份验证- IdentityServer4

检查用户是否使用社交媒体进行身份验证- IdentityServer4
EN

Stack Overflow用户
提问于 2018-12-14 04:20:03
回答 1查看 145关注 0票数 0

我的身份服务器4可以使用ASP.NET身份和社交媒体(Facebook,Google)进行身份验证。

在url下面生成令牌。

http://localhost:5105/connect/token

所以它会做出反应

代码语言:javascript
复制
{
    "access_token": "{Bearer Token}",
    "expires_in": 3600,
    "token_type": "Bearer"
}

这可以添加新的属性调用authenticate_type吗?所以我可以通过社交媒体来了解这个用户的访问权限。

示例:

如果用户通过使用Facebook进行身份验证

代码语言:javascript
复制
{
    "access_token": "{Bearer Token}",
    "expires_in": 3600,
    "token_type": "Bearer",
    "authenticate_type": "Facebook"
}

如果用户通过使用Google进行身份验证

代码语言:javascript
复制
{
    "access_token": "{Bearer Token}",
    "expires_in": 3600,
    "token_type": "Bearer",
    "authenticate_type": "Google"
}

反之亦然。知道怎么做吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-16 23:03:02

我假设您已经知道如何获取登录提供程序信息。如果不是,你可以从

代码语言:javascript
复制
IdentityProvider = string.Join(", ",
                    (await _userManager.GetLoginsAsync(user)).Select(l => l.LoginProvider)),

最好的方法是在索赔中保存这些附加信息。您可以通过添加上述代码来修改身份配置文件服务。

代码语言:javascript
复制
public class IdentityProfileService : IProfileService
{

    private readonly IUserClaimsPrincipalFactory<ApplicationUser> _claimsFactory;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly ApplicationDbContext _db;

    public IdentityProfileService(IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory, UserManager<ApplicationUser> userManager,
        ApplicationDbContext dbContext)
    {
        _claimsFactory = claimsFactory;
        _userManager = userManager;
        _db = dbContext;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        var sub = context.Subject.GetSubjectId();
        var user = await _userManager.FindByIdAsync(sub);
        if (user == null)
        {
            throw new ArgumentException("");
        }

        var principal = await _claimsFactory.CreateAsync(user);
        var claims = principal.Claims.ToList();

        var login = await _userManager.GetLoginsAsync(user);
         login.Select(l => l.LoginProvider).ToList().ForEach(x => claims.Add(new Claim("authenticate_type", x)));

        context.IssuedClaims = claims;
    }

    public async Task IsActiveAsync(IsActiveContext context)
    {
        var sub = context.Subject.GetSubjectId();
        var user = await _userManager.FindByIdAsync(sub);
        context.IsActive = user != null;
    }
}

不要忘记将它附加到您的身份服务器上。

代码语言:javascript
复制
services.AddIdentityServer().AddProfileService<IdentityProfileService>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53773469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档