Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于用户授权构建菜单_C#_Asp.net Mvc_Entity Framework_Asp.net Identity - Fatal编程技术网

C# 基于用户授权构建菜单

C# 基于用户授权构建菜单,c#,asp.net-mvc,entity-framework,asp.net-identity,C#,Asp.net Mvc,Entity Framework,Asp.net Identity,我有一个来自另一个应用程序的实体项目,该项目正被引入一个新的MVC web应用程序中。我希望web用户只能访问少数实体的某些实例。例如,我们有四层组织实体:公司、站点、项目、包。我希望用户X能够访问其中两家公司,这些公司旗下的一些网站,等等 目前,我已将与身份相关的数据库模式添加到托管实体的数据库中,并且身份工作正常。我遇到的问题是将用户连接到其他实体。我有连接表,位于用户表和实体表之间(例如,用户和公司)。不幸的是,这些连接表不能被EF用来处理用户和实体之间的关系,因为它们位于不同的项目中,并

我有一个来自另一个应用程序的实体项目,该项目正被引入一个新的MVC web应用程序中。我希望web用户只能访问少数实体的某些实例。例如,我们有四层组织实体:公司、站点、项目、包。我希望用户X能够访问其中两家公司,这些公司旗下的一些网站,等等

目前,我已将与身份相关的数据库模式添加到托管实体的数据库中,并且身份工作正常。我遇到的问题是将用户连接到其他实体。我有连接表,位于用户表和实体表之间(例如,用户和公司)。不幸的是,这些连接表不能被EF用来处理用户和实体之间的关系,因为它们位于不同的项目中,并且使用不同的上下文

我希望通过使用一个存储的proc只返回多个结果集来缓解这种情况,这些结果集表示用户有权访问的所有实体,但这要求我将实体存储在DTO中,因为使用实体类本身将导致导航属性在视图中枚举时获取所有子实体


如何做到这一点?我必须假设,拥有属于特定用户或可供特定用户查看的特定实例是一个相对正常且经过充分讨论的想法。我是否应该重新创建实体并将它们放在Web项目中?然后,每次添加错误修复或新功能时,我都必须更新实体类的每个副本

您可以在“业务”项目的DbContext中定义ASP.Net标识实体,并使用以下内容在MVC应用程序中获取IdentityUser:

var usermanager = new UserManager<User>(new UserStore<User>(new MyBusinessDbContext));
var identityUser = usermanager.FindById(myUserId);
var usermanager=newusermanager(newuserstore(newmybusinessdbcontext));
var identityUser=usermanager.FindById(myUserId);

请注意,
User
类是
Business
项目的一部分,这意味着您必须将MVC项目中的
ApplicationUser
定义移动到业务项目中

为什么不创建一个承载所有实体模型的“通用”项目呢。然后可供其他项目参考使用。还是我不明白这个问题?@这就是我们在这个案件中所做的。实体项目由windows应用程序和MVC web应用程序使用。由于实体与MVC应用程序中的身份模型分离,它们不能直接引用用户,用户也不能直接引用它们(我不认为)。是否有一些限制,您不能将它们放在一起?@Shoe到目前为止,我还没有在网上找到任何关于将标识功能导入现有实体模型的信息。我可以将现有的实体移动到MVC项目中,但是每次修复错误或在其中实现新功能时,我都必须更新两个项目(原始实体和MVC项目实体)。我不确定你的意思。Identity不关心您使用什么模型,只要它得到它需要的。因此,我真的只需要定义一个与用户、角色等的数据库表结构相匹配的类,在BusinessDbContext中表示它们,并在MVC中如上所述的UserManager实例?是的。我相信不应该有任何问题太棒了!我一会儿就去看看。不过,首先要睡觉(已经睡得太久了)。一个可能的问题是:您必须将
Microsoft.AspNet Identity
Nuget包添加到您的业务项目中,以便
User
IdentityUser
类派生,以便能够将其与MVC项目的
UserManager
一起使用。我几乎让它工作了。我从IdentityDbContext继承了实体DBContext,并通过ApplicationUser类和其他几个类进行了移植。我有一个测试方法,它试图通过ID找到一个用户,还有一个是登录用户,所有这些看起来都很有效,但是现在我在登录页面中得到了一个重定向循环,我正在尝试找出这个方法。