将ASP.NET标识类移动到类库

时间:2015-10-24 16:14:37

标签: c# asp.net-mvc entity-framework asp.net-identity

在将身份类和AccountController复制到ClassLibrary之后,我遇到了一个问题,由于异步方法,我不得不更改一些代码。现在这就是我在AccountController中的内容

原始的Register方法如下所示

public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email, AccountNumber = model.AccountNumber };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
                // Send an email with this link
                // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

                return RedirectToAction("Index", "Home");
            }
            AddErrors(result);
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

我改变了那个方法,它现在看起来像这个

public void Register(RegisterAdministrator model)
    {
        var user = new ApplicationUser { UserName = model.UserName, Email = model.Email, AccountNumber = model.AccountNumber };
        var result = UserManager.CreateAsync(user, model.Password);
    }

我不熟悉异步和等待,所以我认为删除它就可以了,我错了。

我正在使用JQuery Ajax来调用控制器中的方法,而控制器中的方法就是这个

[HttpPost]
public void AddNewAdministrator(NewAdministrator administrator)
    {
        #region Initialization

        OAD = new OQOEAdminstrationDAL();

        #endregion

        OAD.CreateNewAdministrator(administrator);
    }

CreateNewAdministrator(管理员)就是这个

public void CreateNewAdministrator(NewAdministrator administrator)
    {
        #region Initialization

        RegisterAdministrator rva = new RegisterAdministrator();

        rva.UserName = administrator.administratorName;
        rva.Email = administrator.administratorEmail;
        rva.Password = administrator.administratorPassword;

        #endregion

        AccountController.Register(rva);
    }

然后Register方法就是我在上面显示的方法,这里又是

public void Register(RegisterAdministrator model)
    {
        var user = new ApplicationUser { UserName = model.UserName, Email = model.Email, AccountNumber = model.AccountNumber };
        var result = UserManager.CreateAsync(user, model.Password);
    }

在我添加

之前
  

var result = UserManager.CreateAsync(user,model.Password);

这个方法,我会检查数据库,它不会填充我从

传递的内容
  

var user = new ApplicationUser {UserName = model.UserName,Email = model.Email,AccountNumber = model.AccountNumber};

所以我得出的结论是,除非我的方法中有这个,否则表格不会被填充

  

var result = UserManager.CreateAsync(user,model.Password);

所以我添加了它,当我单步执行代码时,当我得到var结果时会抛出错误,这里是错误的堆栈跟踪

System.IO.FileLoadException was unhandled by user code

的HResult = -2146234304   消息=无法加载文件或程序集&#39; Microsoft.Owin.Host.SystemWeb,Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35&#39;或其中一个依赖项。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT异常:0x80131040)   来源= AdvanceWareDAL   FileName = Microsoft.Owin.Host.SystemWeb,Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35   FusionLog ====预绑定状态信息=== 日志:DisplayName = Microsoft.Owin.Host.SystemWeb,Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35  (完全指定的) 日志:Appbase = file:/// C:/ AdvanceWareRevision / AdvanceWareMVC / 日志:初始PrivatePath = C:\ AdvanceWareRevision \ AdvanceWareMVC \ bin

调用程序集:AdvanceWareDAL,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null。

日志:此绑定在默认加载上下文中启动。 日志:使用应用程序配置文件:C:\ AdvanceWareRevision \ AdvanceWareMVC \ web.config 日志:使用主机配置文件:C:\ Users \ Simon \ Documents \ IISExpress \ config \ aspnet.config 日志:使用C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config中的计算机配置文件。 日志:政策后参考:Microsoft.Owin.Host.SystemWeb,Version = 3.0.1.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35 日志:尝试下载新的URL文件:/// C:/ Users / Simon / AppData / Local / Temp / Temporary ASP.NET Files / root / d8b6b64c / 32bc7a85 / Microsoft.Owin.Host.SystemWeb.DLL。 日志:尝试下载新的URL文件:/// C:/ Users / Simon / AppData / Local / Temp / Temporary ASP.NET Files / root / d8b6b64c / 32bc7a85 / Microsoft.Owin.Host.SystemWeb / Microsoft.Owin.Host .SystemWeb.DLL。 日志:尝试下载新的URL文件:/// C:/AdvanceWareRevision/AdvanceWareMVC/bin/Microsoft.Owin.Host.SystemWeb.DLL。 警告:比较程序集名称导致不匹配:构建号 错误:无法完成程序集的设置(hr = 0x80131040)。探测终止。

堆栈跟踪:        在AdvanceWareDAL.Authentication.AccountController.get_UserManager()        在AdvancedWareDAL.Authentication.AccountController.Register(RegisterAdministrator模型)的c:\ AdvanceWareRevision \ AdvanceWareDAL \ Authentication \ AccountController.cs:第201行        在AdvancedWareDAL.OQOEAdminstrationDAL.CreateNewAdministrator(NewAdministrator administrator)的c:\ AdvanceWareRevision \ AdvanceWareDAL \ OQOEAdminstrationDAL.cs:第45行        在AdvancedWareMVC.Controllers.AdministrationController.AddNewAdministrator(NewAdministrator administrator)中的c:\ AdvanceWareRevision \ AdvanceWareMVC \ Controllers \ AdministrationController.cs:第45行        在lambda_method(Closure,ControllerBase,Object [])        在System.Web.Mvc.ActionMethodDispatcher。&lt;&gt; c__DisplayClass1.b__0(ControllerBase controller,Object []参数)        在System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,Object []参数)        在System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2个参数)        在System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod()        在System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult,ActionInvocation innerInvokeState)        在System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 2.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End()        在System.Web.Mvc.Async.AsyncResultWrapper.End [TResult](IAsyncResult asyncResult,Object tag)        在System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)        在System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d()        在System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters。&lt;&gt; c__DisplayClass46.b__3f()   的InnerException:

我之所以将Identity类和AccountController添加到ClassLibrary是因为我想将它与主项目分开,并且假设这样做比使用滚动更容易&#34;手动滚动&#34;代码比执行此操作。

我在想,如果我能够在ClassLibrary中添加一个App_Start文件夹和一个配置文件,我可以加载堆栈跟踪正在查找的内容,从我读过的内容看,ClassLibrary并不像那样工作。 我可以编写自己的方法来填充AspNetUsers表,但那会破坏使用Identity类的目的。

所以我有点坚持如何解决所有问题所以我可以利用我的ClassLibrary中的Identity框架。

2 个答案:

答案 0 :(得分:1)

您似乎正在使用Microsoft.Owin.Host.SystemWeb,它使基于OWIN的应用程序能够使用ASP.NET请求管道在IIS上运行,而这不适用于类库

确保您没有将OWIN身份验证管理器与代码一起移动。您可以将与存储相关的类和代码移动到类库中,并将身份验证管道保留在Web应用程序中。

This文章解释了ASP.NET身份存储提供程序,在您的情况下可以将其移动到您的类库中,

答案 1 :(得分:0)

不确定这是否可以解决您的问题,但它可能有所帮助。 在我看来,这是由.NET使用的引用引起的问题。 尝试再次加载它们并重建。如果错误仍然存​​在,则尝试查找并加载先前项目中使用的引用。如果这有助于您,请告诉我:)。