1. ホーム
  2. c#

[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストに対するモデルの一部ではありません。

2022-02-05 02:31:33

質問

私はAsp.netでEntity Framework 6とデータベースファーストでWebアプリケーションを持っています。私はそれがユーザーが接続するために来るとき、問題を持っています。

Web.config

 <connectionStrings>
  <add name="DefaultConnection" connectionString="data source=MyServer\MyDataBase;initial catalog=Cliniciel_WebRV_Master;User Id=XXX;Password=XXXX" providerName="System.Data.SqlClient" />
  <add name="Cliniciel_WebRV_MasterEntities" connectionString="metadata=res://*/Models.Entities.Cliniciel_WebRV_Master.csdl|res://*/Models.Entities.Cliniciel_WebRV_Master.ssdl|res://*/Models.Entities.Cliniciel_WebRV_Master.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MyServer\MyDataBase;initial catalog=Cliniciel_WebRV_Master;user id=XXX;password=XXXX;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  <add name="Cliniciel_WebRV_Entities" connectionString="metadata=res://*/Models.Entities.Cliniciel_WebRV_Entities.csdl|res://*/Models.Entities.Cliniciel_WebRV_Entities.ssdl|res://*/Models.Entities.Cliniciel_WebRV_Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MyServer\MyDataBase;initial catalog=Cliniciel_WebRV_DEV;user id=XXX;password=XXXX;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  <add name="Cliniciel_WebRV_Oauth" connectionString="metadata=res://*/Models.Entities.Cliniciel_WebRV_Oauth.csdl|res://*/Models.Entities.Cliniciel_WebRV_Oauth.ssdl|res://*/Models.Entities.Cliniciel_WebRV_Oauth.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MyServer\MyDataBase;initial catalog=Cliniciel_WebRV_Master;user id=XXX;password=XXXX;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />          
 </connectionStrings>

ここでは、ID認証に接続文字列 "Cliniciel_WebRV_Oauth" を使用しています。

起動時にoauthTokenを設定する

スタートアップ.cs

   private void ConfigureOAuthTokenGeneration(IAppBuilder app)
        {
            //// Configure the db context and user manager to use a single instance per request
            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

            //app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
            OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                //For Dev enviroment only (on production should be AllowInsecureHttp = false)
                #if DEBUG
                AllowInsecureHttp = true,
                #endif
                TokenEndpointPath = new PathString("/oauth/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                Provider = new CustomOAuthProvider(),
                AccessTokenFormat = new CustomJwtFormat("http://localhost:55555/")

            };

            // OAuth 2.0 Bearer Access Token Generation
            app.UseOAuthAuthorizationServer(OAuthServerOptions);
        }

 private void ConfigureOAuthTokenConsumption(IAppBuilder app)
        {

            var issuer = "http://localhost:55555/";
            string audienceId = ConfigurationManager.AppSettings["as:AudienceId"];
            byte[] audienceSecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["as:AudienceSecret"]);

            // Api controllers with an [Authorize] attribute will be validated with JWT
            app.UseJwtBearerAuthentication(
                new JwtBearerAuthenticationOptions
                {
                    AuthenticationMode = AuthenticationMode.Active,
                    AllowedAudiences = new[] { audienceId },
                    IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                    {
                        new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret)
                    }
                });
        }

ApplicationDBContext.cs

using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.SessionState;
using WebRV.Models.Entities;

namespace WebRV.Infrastructure
{

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>  //DOIT CREER APPLICATION USER.
    {

        public ApplicationDbContext()
            : base("Cliniciel_WebRV_Oauth", throwIfV1Schema: false)
        {
            Configuration.ProxyCreationEnabled = false;
            Configuration.LazyLoadingEnabled = false;
        }

        [WebMethod(EnableSession = true)]
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }

    }
}

CustomOAuthProvider.cs

using System;
using System.Linq;
using WebRV.Infrastructure;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.OAuth;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity.Owin;
using System.Web.Mvc;
using WebRV.Models.Entities;
using System.Net;
using System.Web.Http;


namespace WebRV.Providers
{

    public class CustomOAuthProvider : OAuthAuthorizationServerProvider
    {
        [ValidateAntiForgeryToken]
        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            context.Validated();
            return Task.FromResult<object>(null);
        }

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
                var allowedOrigin = "*";

                context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });

                var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

                ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

                if (user == null)
                {
                    context.SetError("invalid_grant", "The user name or password is incorrect.");

                }
                else
                {

                    //if (!user.EmailConfirmed)
                    //{
                    //    context.SetError("invalid_grant", "User did not confirm email.");
                    //    return;
                    //}


                    ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, "JWT");

                    var ticket = new AuthenticationTicket(oAuthIdentity, null);

                    context.Validated(ticket);
                }

        }
    }
}

以下は、私が受け取ったエラーです。

ApplicationUser エンティティタイプは、そのモデルの一部ではありません。 現在のコンテキスト

これがそのトレースです。

<ブロッククオート

32ページ:var userManager = コンテキスト.OwinContext.GetUserManager(); Ligne 33 : Ligne 34 : ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); Ligne 35 : Ligne 36 : if (user == null)

Fichier source : c:\Usersaboucher⇄Desktop⇄WebRV-2016-05-12 - (Fichier source : c:⇄WebRV-2016-05-12) CopieCliniciel_WebRV ╱WebRVProviders ╱CustomOAuthProvider.cs
言語 : 34

パイルの跡。

[InvalidOperationException: ApplicationUser タイプは、アプリケーションユーザーではありません。 現在の状況下では、モデルに含まれていません。]
System.Data.Entity.Internal.InternalContext.UpdateEntitySetMappingsForType(タイプ entityType) +4479799
System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(タイプ entityType) +37
System.Data.Entity.Internal.Linq.InternalSet 1.Initialize() +53
System.Data.Entity.Internal.Linq.InternalSet
1.get_InternalContext() +16 System.Data.Entity.Infrastructure.DbQuery(システムデータ エンティティ インフラストラクチャ ドット インクエリ 1.System.Linq.IQueryable.get_Provider() +39 System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync(IQueryable 1 ソース、エクスプレッション 1 predicate, CancellationToken cancellationToken) +154 System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync(IQueryable 1 ソース, 式 1 predicate) +163
Microsoft.AspNet.Identity.EntityFramework.<GetUserAggregateAsync>d__6c.MoveNext() +807 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() +28 Microsoft.AspNet.Identity.CultureAwaiter 1.GetResult() +123 Microsoft.AspNet.Identity.<FindAsync>d__12.MoveNext() +601
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() +28 WebRV.Providers.d__0.MoveNext() in c:♪Users♪Boucher♪Desktop♪WebRV-2016-05-12 - (C:♪Users♪Boucher♪Desktop♪WebRV-2016-05-12) CopieCliniciel_WebRV ╱WebRVProviders╱CustomOAuthProvider.cs:34 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task タスク) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) +58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()。 +26 Microsoft.Owin.Security.OAuth.d__3f.MoveNext() +863 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) +58 System.Runtime.CompilerServices.TaskAwaiter(システムランタイムコンパイラサービスタスクウェイター 1.GetResult() +28 Microsoft.Owin.Security.OAuth.<InvokeTokenEndpointAsync>d__22.MoveNext() +2336 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 System.Runtime.CompilerServices.TaskAwaiter.GetResult() +26 Microsoft.Owin.Security.OAuth.<InvokeAsync>d__0.MoveNext() +1733 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() +28 Microsoft.Owin.Security.Infrastructure.d__0.MoveNext() +664 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task) タスク) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) +58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()を実行します。 +26 Microsoft.AspNet.Identity.Owin.d__0.MoveNext() +641 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) +58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()を実行します。 +26 Microsoft.AspNet.Identity.Owin.d__0.MoveNext() +641 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) +58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()(タスクウェイターゲットリザルト)。 +26 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__5.MoveNext()。 +287 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) +58 System.Runtime.CompilerServices.TaskAwaiter.GetResult()(タスクウェイターゲットリザルト)。 +26 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__2.MoveNext()。 +272 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +26 Microsoft.Owin.Host.SystemWeb.Infrastructure.ErrorState.Rethrow()エラー状態() +33 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult) ar) +150
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult) ar) +42
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()で実行されます。 +380 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

どのように解決するのですか?

ApplicationUserManager メソッドはどこですか?

このようにDbContextを渡してApplication UserManagerを設定する必要があります。

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<EducationContext>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };

        // Configure validation logic for passwords
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = true,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };

        // Configure user lockout defaults
        manager.UserLockoutEnabledByDefault = true;
        manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
        manager.MaxFailedAccessAttemptsBeforeLockout = 5;

        // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
        // You can write your own provider and plug it in here.
        manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<ApplicationUser>
        {
            MessageFormat = "Your security code is {0}"
        });
        manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<ApplicationUser>
        {
            Subject = "Security Code",
            BodyFormat = "Your security code is {0}"
        });
        manager.EmailService = new EmailService();
        manager.SmsService = new SmsService();
        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = 
                new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }
        return manager;
    }
}

最も重要なのは、この行を書くことです(Createメソッドの1行目)。

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<EducationContext>()));