Проблемы с расширением свойств из Identity (ASP.NET Core) - PullRequest
0 голосов
/ 01 мая 2018

У меня проблемы с расширением свойств из Identity.

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

Я пытался следовать этому ответу , но похоже, что они используют другую версию ASP.NET. Я использую ASP.NET Core, версия: 2.0.3

Вот код моего ApplicationUser.cs файла

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;

namespace src.Models
{
    public class ApplicationUser : IdentityUser
    {

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) {

            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

            userIdentity.AddClaim(new Claim("FirstName", this.FirstName.ToString()));
            userIdentity.AddClaim(new Claim("LastName", this.LastName.ToString()));
            userIdentity.AddClaim(new Claim("JobTitle", this.JobTitle.ToString()));
            userIdentity.AddClaim(new Claim("Status", this.Status.ToString()));

            return userIdentity;
        }

        string FirstName { get; set; }
        string LastName { get; set; }
        string JobTitle { get; set; }
        string Status { get; set; }
        int Age { get; set; }
    }
}

Я получаю сообщение об ошибке CreateIdentityAsync с ошибкой:

'UserManager<ApplicationUser>' does not contain a definition for 'CreateIdentityAsync' 
and no extension method 'CreateIdentityAsync' accepting a first argument of type 
'UserManager<ApplicationUser>' could be found (are you missing a using directive 
or an assembly reference?) [src]

и ошибка DefaultAuthenticationTypes, ошибка:

The name 'DefaultAuthenticationTypes' does not exist in the current context [src]

Это невозможно с ASP.NET Core или я что-то не так делаю?

Ответы [ 2 ]

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

добавляем к @remi оригинальное решение здесь https://adrientorris.github.io/aspnet-core/identity/extend-user-model.html

public class ApplicationUser : IdentityUser {
    public string FirstName { get; set; }

    public string LastName { get; set; }
}

Создать фабрику принципалов

public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole> {
public AppClaimsPrincipalFactory(
    UserManager<ApplicationUser> userManager
    , RoleManager<IdentityRole> roleManager
    , IOptions<IdentityOptions> optionsAccessor)
: base(userManager, roleManager, optionsAccessor)
{ }

public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
    var principal = await base.CreateAsync(user);

    if (!string.IsNullOrWhiteSpace(user.FirstName))
    {
        ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
    new Claim(ClaimTypes.GivenName, user.FirstName)
});
    }

    if (!string.IsNullOrWhiteSpace(user.LastName))
    {
        ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
     new Claim(ClaimTypes.Surname, user.LastName),
});
    }

    return principal;
}

}

Добавить в класс запуска

public void ConfigureServices(IServiceCollection services)
{
    // [...]

    services.AddDbContext<SecurityDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Security")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<SecurityDbContext>()
        .AddDefaultTokenProviders();

    services.AddScoped<Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();

    // [...]
}
0 голосов
/ 01 мая 2018

Я понял это сам. То, что я пытался сделать, было невозможно с ASP.NET Core. Я должен был сделать что-то еще.

Я создал файл AppClaimsPrincipalFactory.cs

public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
    public AppClaimsPrincipalFactory(
        UserManager<ApplicationUser> userManager
        , RoleManager<IdentityRole> roleManager
        , IOptions<IdentityOptions> optionsAccessor)
    : base(userManager, roleManager, optionsAccessor)
    { }

    public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
    {
        var principal = await base.CreateAsync(user);

        if (!string.IsNullOrWhiteSpace(user.FirstName))
        {
        ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
        new Claim(ClaimTypes.GivenName, user.FirstName)
    });
        }

        if (!string.IsNullOrWhiteSpace(user.LastName))
        {
            ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
         new Claim(ClaimTypes.Surname, user.LastName),
    });
        }

        return principal;
    }
}

Добавил эту строку в мой файл Startup.cs

services.AddScoped<Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();

...