Проверьте пользователя, если аутентифицируетесь с помощью социальных сетей - IdentityServer4 - PullRequest
0 голосов
/ 14 декабря 2018

Мой Identity Server 4 может выполнять проверку подлинности с использованием ASP.NET Identity and Social Media (Facebook, Google)

Ниже URL-адреса для создания токена

http://localhost:5105/connect/token

То есть будет ответ

{
    "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"
}

и наоборот.Есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Я предполагаю, что вы уже знаете, как получить информацию о провайдере входа.если нет, вы можете получить его из

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

. Лучший способ сохранить эту дополнительную информацию - в претензиях.Вы можете изменить службу профилей личности, добавив приведенный выше код

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>();
0 голосов
/ 15 декабря 2018

В id_token должно быть утверждение под названием IDP, представляющее используемый поставщик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...