Я получил ошибку при выполнении демонстрационного веб-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;
}
}