0

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

  1. 库 - 基础数据模型(用户、角色等)
public class User
{
  public int ID { get; set; }
  public string Comments { get; set; }....
}
  1. 库 - 扩展数据模型(合作伙伴、产品) - 这可能因不同的 Web 应用程序而异。
  2. 图书馆 - 会员提供者。

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

public class DSContext:DbContext
{
   public DbSet<User> Users { get; set; }
}

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

var pUser = SomeDBContext.Users.Find(Username);
return new MembershipUser(...Set properties from pUser...);

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

经过一些试验和错误得到了解决方案 随意评论 - 因为我不知道它有多正确。

  1. 类库
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. 提供者 - 关键是使其抽象
public abstract class STMembershipProvider : ExtendedMembershipProvider

并添加抽象属性

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
public class EFContext:CL.UserContext
{

}

public class LocalMp:MP.STMembershipProvider
{
    public override CL.UserContext DB
    {
        get
        {
            return new EF.Models.EFContext();
        }
    }
}

这就是魔法:)

4

1 回答 1

0

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

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

希望这会有所帮助。

于 2013-01-06T12:07:20.523 回答