首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将MVC应用程序与成员资格提供程序和不同类库中的数据模型连接在一起?

如何将MVC应用程序与成员资格提供程序和不同类库中的数据模型连接在一起?
EN

Stack Overflow用户
提问于 2013-01-06 10:12:37
回答 1查看 538关注 0票数 0

我有3个类库和ASP.MVC 4 web应用程序。

  1. 库-基础数据模型(用户、角色等)

代码语言:javascript
运行
复制
public class User
{
  public int ID { get; set; }
  public string Comments { get; set; }....
}
  1. 库-扩展数据模型(合作伙伴,产品)-这可以不同的网络应用程序。
  2. 图书馆-会员提供者。

我在MVC应用程序中创建了我的DBContext,因为只有在那里我才知道当前应用程序需要哪个DBSet

代码语言:javascript
运行
复制
public class DSContext:DbContext
{
   public DbSet<User> Users { get; set; }
}

我可以在MVC应用程序中访问和使用两个数据库中的模型(而且它可以工作),但是如何告诉membership provider使用我在MVC应用程序中使用的相同的DBContext呢?

代码语言:javascript
运行
复制
var pUser = SomeDBContext.Users.Find(Username);
return new MembershipUser(...Set properties from pUser...);

SomeDBContext可以是具有属性Users的任何DbContext,该属性具有来自第一类库的User类型。

在经过一些尝试和错误后,得到了这个的解决方案,可以随意评论--因为我不知道它有多正确。

  1. 类库

代码语言:javascript
运行
复制
public class User
{
   [Required]
   [Key]
   public string UserName{get; set;}
   public string PassWord{ get; set;}
}

public class UserContext : DbContext
{
   public DbSet<User> Users { get; set; }
}
  1. 提供者-关键是使它变得抽象。

代码语言:javascript
运行
复制
public abstract class STMembershipProvider : ExtendedMembershipProvider

并添加抽象属性

代码语言:javascript
运行
复制
public abstract CL.UserContext DB { get; }

public override bool ValidateUser(string username, string password)
{

    User dbuser = DB.Users.Find(username);

    if (dbuser != null)
    {
        if (dbuser.PassWord == password) return true;
    }
    return false;
}
  1. 在MVC应用程序中,创建从类库DbContext继承的本地DbContext和从库中的MembershipProvider继承的本地提供程序。

代码语言:javascript
运行
复制
public class EFContext:CL.UserContext
{

}

代码语言:javascript
运行
复制
public class LocalMp:MP.STMembershipProvider
{
    public override CL.UserContext DB
    {
        get
        {
            return new EF.Models.EFContext();
        }
    }
}

这就产生了魔力:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-06 12:07:20

要使用通用库进行用户权限和访问,您必须设计一个抽象层,将由您的成员资格提供者使用。由于DBContext直接连接到特定的业务域,并且您希望使用通用库进行访问和授权,所以需要将项目的特定对象映射到抽象层。我可以想象,这样的抽象层应该允许以以下方式对实体(或表)进行操作:

  1. 获取业务对象的特定实例
  2. 将其映射(或强制转换)到抽象层安全对象A
  3. 运行您的成员资格提供程序来对对象A执行安全工作
  4. 使用输出来决定任何操作(允许访问,限制访问).

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14181139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档