This is my login function:
LoginViewModel lvm = new LoginViewModel
{
UserName = Input.UserName,
Password = Input.Password,
RememberMe = Input.RememberMe
};
var valid = accountsData.Authenticate(lvm);
if (valid != null)
{
var avm = applicationUsersData.GetByUsername(Input.UserName);
var user = applicationUsersData.Get(avm.Id);
var roles = userRolesData.GetUserRoles(user.Id);
claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.UserName, user.UserName));
claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.Email, user.Email));
claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.PhoneNumber, user.PhoneNumber));
claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.FirstName, user.FirstName));
claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.LastName, user.LastName));
claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.Id, user.Id));
foreach (var item in roles)
{
var currentItem = new UserRoleDetailsViewModel
{
Id = item.Id,
Name = item.Name,
ApplicationId = item.ApplicationId,
ApplicationName = item.ApplicationName
};
var convertedItem = JsonConvert.SerializeObject(currentItem);
claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.Roles, convertedItem));
}
await _customClaimsCookieSignInHelper.SignInUserAsync(user, Input.RememberMe, claims);
activityLogger.Log(HttpContext, user.Id, configuration[DSCASGlobals.DS_Name], configuration[DSCASGlobals.DS_Id], Input.UserName + " logged in");
return LocalRedirect(returnUrl);
}
accountsData.Authenticate is located in a referenced dll assembly called ManagementStudio.Data and looks like this:
[AllowAnonymous]
public ApplicationUsers Authenticate(LoginViewModel Input)
{
PasswordHasher<ApplicationUsers> passwordHasher = new PasswordHasher<ApplicationUsers>();
ApplicationUsers user = new ApplicationUsers();
try
{
user = dbContext.ApplicationUsers.SingleOrDefault(u => u.Email == Input.UserName);
if(user != null)
{
if (passwordHasher.VerifyHashedPassword(user,user.PasswordHash,Input.Password) == PasswordVerificationResult.Success)
{
return user;
}
else
{
return null;
}
}
}
catch(Exception e)
{
logger.LogError(e, LoggingGlobals.Error);
return null;
}
return user;
}
When I run the application and login, I get this error:
An exception occurred while iterating over the results of a query for context type 'ManagementStudio.Data.Models.ManagementStudioDbContext'. System.Data.SqlClient.SqlException (0x80131904): Invalid object name 'ApplicationUsers'. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource1 completion, Int32 timeout, Task& task, Boolean asyncWrite, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.ExecuteReader() at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary
2 parameterValues) at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary2 parameterValues) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable
1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func3 operation, Func
3 verifySucceeded) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable1.Enumerator.MoveNext() at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable
1 source) at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ResultEnumerable1.GetEnumerator() at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider._TrackEntities[TOut,TIn](IEnumerable
1 results, QueryContext queryContext, IList1 entityTrackingInfos, IList
1 entityAccessors)+MoveNext() at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor1.EnumeratorExceptionInterceptor.MoveNext() at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable
1 source, Boolean& found) at System.Linq.Enumerable.First[TSource](IEnumerable1 source) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass15_1
1.b__0(QueryContext qc) ClientConnectionId:7c19efa6-d951-4139-8135-8dbcd5050c20 Error Number:208,State:1,Class:16
ApplicationUsers is my IdentityUser and is located in ManagementStudio.Data.Models. DocumentStudio references it.
public class ApplicationUsers : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime? DateOfBirth { get; set; }
private DateTime createdOn = DateTime.Now;
public DateTime CreatedOn
{
get
{
return (createdOn == DateTime.MinValue) ? DateTime.Now : createdOn;
}
set
{
createdOn = value;
}
}
private DateTime updatedOn = DateTime.Now;
public DateTime UpdatedOn
{
get
{
return (updatedOn == DateTime.MinValue) ? DateTime.Now : updatedOn;
}
set
{
updatedOn = value;
}
}
}
How can I solve this issue?
EDIT:
My full DBSet
public DbSet<ApplicationUsers> ApplicationUsers { get; set; }
public DbSet<UserRoles> UserRoles { get; set; }
public DbSet<IdentityUserRole<string>> IdentityUserRole { get; set; }
public DbSet<IdentityUserClaim<string>> IdentityUserClaim { get; set; }
public DbSet<Applications> Applications { get; set; }
public DbSet<Roles> Roles { get; set; }
public DbSet<ApiAccess> ApiAccess { get; set; }
public DbSet<EventLogs> EventLogs { get; set; }
public DbSet<ActivityLogs> ActivityLogs { get; set; }
public DbSet<CommunicationLogs> CommunicationLogs { get; set; }
public DbSet<UploadLogs> UploadLogs { get; set; }
public DbSet<Repositories> Repositories { get; set; }
public DbSet<Emails> Emails { get; set; }
public DbSet<Assets> Assets { get; set; }
public DbSet<Announcements> Announcements { get; set; }
public DbSet<AnnouncementAttachments> AnnouncementAttachments { get; set; }
As you said in comments your table name for ApplicationUsers
class is ManagementStudio.ApplicationUsers
. You need to tell EF your schema name, because it use dbo
by default. There is a lot of ways to do this:
Use TableAttribute:
[Table("ApplicationUsers", Schema = "ManagementStudio")]
public class ApplicationUsers : IdentityUser
{
}
Use fluent API:
public class ManagementStudioDbContext: IdentityDbContext
{
public DbSet<ApplicationUsers> ApplicationUsers { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.ToTable("ApplicationUsers", schema: "ManagementStudio");
}
}
Set default schema name with fluent API:
public class ManagementStudioDbContext: IdentityDbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("MyCustomSchema");
}
}
User contributions licensed under CC BY-SA 3.0