簡體   English   中英

檢查用戶是否使用社交媒體進行身份驗證-IdentityServer4

[英]Check user if authenticate using social media - IdentityServer4

我的Identity Server 4可以使用ASP.NET身份和社交媒體(Facebook,Google)進行身份驗證

在網址下方生成令牌

HTTP://本地主機:5105 /連接/令牌

所以它會回應

{
    "access_token": "{Bearer Token}",
    "expires_in": 3600,
    "token_type": "Bearer"
}

有可能添加新的屬性調用authenticate_type嗎? 所以我可以通過使用或不使用社交媒體來了解該用戶的訪問權限。

例:

如果用戶通過使用Facebook進行身份驗證

{
    "access_token": "{Bearer Token}",
    "expires_in": 3600,
    "token_type": "Bearer",
    "authenticate_type": "Facebook"
}

如果用戶通過使用Google進行身份驗證

{
    "access_token": "{Bearer Token}",
    "expires_in": 3600,
    "token_type": "Bearer",
    "authenticate_type": "Google"
}

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

在id_token中應該有一個稱為IDP的聲明,它代表使用的提供者。

我假設您已經知道如何獲取登錄提供程序信息。 如果沒有,你可以從

IdentityProvider = string.Join(", ",
                    (await _userManager.GetLoginsAsync(user)).Select(l => l.LoginProvider)),

最好的方式是保存此附加信息在Claims中。 您可以通過添加上述代碼來修改您的身份資料服務

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;
    }
}

不要忘記將其附加到您的身份服務器

services.AddIdentityServer().AddProfileService<IdentityProfileService>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM