OwinContext. Тип сущности IdentityUser не является частью модели для текущего контекста - PullRequest
0 голосов
/ 04 июля 2018

Я получил ошибку при выполнении демонстрационного веб-API с использованием .NET Framework и при попытке реализовать пользовательскую аутентификацию с использованием JWT и Identity Framework, все шло гладко.

У меня уже была простая аутентификация с использованием Identity, которая уже работала, но когда я реализовал связь между AspNetUsers и моей моделью Person , я получил исключение * 'Тип сущности IdentityUser не является частью модели для текущего контекста. '*

Я думаю, что это также может быть связано с OwinContext, потому что при отладке все работает нормально, он получает пользовательские данные из таблицы, но при выполнении следующего кода он просто возвращает исключение (упомянутое выше).

Также я думаю, что это отличается от других вопросов, потому что OwinContext - это тот, который вызывает исключение при использовании метода GetRoles.

var userRoles = context.OwinContext.Get<TwitterUserManager>().GetRoles(user.Id.ToString());

Мой Контекст БД :

public class FakeTwitterContext: IdentityDbContext<ApplicationUser>
{

    public FakeTwitterContext() : base("FakeTwitterConnection")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

}

My ApplicationUser :

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    //. . .

    public virtual ApplicationUser ApplicationUser { get; set; }
}

public class ApplicationUser : IdentityUser
{
    public virtual Person Person { get; set; }

    public ApplicationUser(): base()
    {

    }
}

My PersonEntityConfig :

public class PersonConfiguration : EntityTypeConfiguration<Person>
{
    public PersonConfiguration()
    {
        //. . .

        HasRequired(p => p.ApplicationUser)
            .WithRequiredDependent(appUser => appUser.Person)
            .Map(p => p.MapKey("UserId"));
    }
}

И мой CustomOAuthProvider.cs (где код вылетает)

public class CustomOAuthProvider : OAuthAuthorizationServerProvider
{
    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

        var user = context.OwinContext.Get<FakeTwitterContext>()
            .Users.FirstOrDefault(u => u.UserName == context.UserName);

        if (!context.OwinContext.Get<TwitterUserManager>()
            .CheckPassword(user, context.Password)
            )
        {
            context.SetError("invalid_grant", "The user name or password is incorrect");
            context.Rejected();
            return Task.FromResult<object>(null);
        }

        var ticket = new AuthenticationTicket(SetClaimsIdentity(context, user), new AuthenticationProperties());
        context.Validated(ticket);

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

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
        return Task.FromResult<object>(null);
    }

    private static ClaimsIdentity SetClaimsIdentity(OAuthGrantResourceOwnerCredentialsContext context, ApplicationUser user)
    {
        var identity = new ClaimsIdentity("JWT");
        identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
        identity.AddClaim(new Claim("sub", context.UserName));

        //Error
        //The entity type IdentityUser is not part of the model for the current context.
        var userRoles = context.OwinContext.Get<TwitterUserManager>().GetRoles(user.Id.ToString());
        foreach (var role in userRoles)
        {
            identity.AddClaim(new Claim(ClaimTypes.Role, role));
        }

        return identity;
    }
}
...