Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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
nTier应用程序中的.Net成员资格_.net_Asp.net Mvc_Asp.net Membership_N Tier Architecture - Fatal编程技术网

nTier应用程序中的.Net成员资格

nTier应用程序中的.Net成员资格,.net,asp.net-mvc,asp.net-membership,n-tier-architecture,.net,Asp.net Mvc,Asp.net Membership,N Tier Architecture,假设我有一个ASP.NETMVC应用程序,这个应用程序(UI)引用了业务逻辑层(BLL),BLL引用了我的数据访问层(DAL) 我正在使用自定义成员资格和角色提供程序进行授权 我正在尝试确定哪些层需要引用我的成员资格提供程序 在MVC中,您可以通过以下方式执行授权检查: [Authorize(Roles = "SomeRoleName")] public ActionResult Index() { //do something } 在我的BLL中,我可能希望检查用户是否也担任角色: publ

假设我有一个ASP.NETMVC应用程序,这个应用程序(UI)引用了业务逻辑层(BLL),BLL引用了我的数据访问层(DAL)

我正在使用自定义成员资格和角色提供程序进行授权

我正在尝试确定哪些层需要引用我的成员资格提供程序

在MVC中,您可以通过以下方式执行授权检查:

[Authorize(Roles = "SomeRoleName")]
public ActionResult Index()
{
//do something
}
在我的BLL中,我可能希望检查用户是否也担任角色:

public static bool IsRoleEditor(User user, Role userRole)
  {
   bool retValue = false;

   if (user.Application.AppID == UserRole.Application.AppID)
   {
        if (Roles.IsUserInRole("ModifyRoles"))
        {
           retValue = true;
        }


    return retValue;
   }
如果我这样做的话,我必须引用并实例化两个层中的成员类。这是构建这样一个应用程序的正确方法吗?看起来有很多冗余

既然我有一个BLL,我是否应该避免使用“[Authorize(Roles=“SomeRoleName”)]”属性,而是从MVC代码中调用一个BLL函数来检查用户是否在角色中?如果我这样做,MVC仍然需要一个成员资格提供者的引用来进行身份验证,这样就可以利用登录和其他ASP控件,对吗


我是否偏离了基础,朝着错误的方向前进?

让您的用户对象实现IPrincipal界面,并将其扔到各个层上。然后您仍然可以使用内置的[Autorize]属性

3年前写的一篇关于城堡的文章,可能会有所帮助。它开始进入我的原则的东西一半下来

HTHS

查尔斯

好问题,今天我问自己同样的问题。我的一个想法(但我不确定这是否是最好的方法)是使用一个接口(例如:IRoleProvider),您可以将它传递给BLL来测试您的访问

public static bool IsRoleEditor(User user, IRoleProvider rp)
{
     return (rp.IsUserInRole(user,"ModifyRoles"));
}
这样,您仍然可以在BLL中验证您的访问,您可以在单元测试中使用模拟来检查您的逻辑,您只需要在MVC网站中创建一个类(或在baseController类中实现),该类将实现IRoleProvider,并使用ASP.NET授权API进行适当的检查


希望这会有所帮助。

角色访问通常不应该在BLL中。访问是用户界面的责任

如上所述,利用IPrinciple接口,正如上述海报所述。您可以在线程级别访问IPrinciple

Thread.CurrentPrincipal

为什么不将角色传递到BLL中,这样您就不会依赖于成员资格。或者使用MartinB建议的界面

当您的利害关系人决定使用不同形式的身份验证,而您不再使用角色对象时,将来会发生什么情况

例如:

IsRoleEditor(User user, string[] roles)
{
  return roles.Contains("ModifyRoles");
}

在我看来,这是会员/角色设计的一个弱点

我解决这个问题的方法是,例如,在分布式n层应用程序的UI和BLL层上都有基于角色的授权,在BLL层中公开一个服务,该服务公开相关的位(GetRolesForUser等),并通过调用服务器上的RoleProvider来实现

然后在客户机上实现自定义RoleProvider,通过调用BLL公开的服务来实现

这样,UI层和BLL层都共享相同的角色提供程序。UI层可以使用当前用户角色的知识来改进UI(例如隐藏/禁用与未授权功能相对应的UI控件),BLL可以确保用户无法执行
未经授权的业务逻辑。

您没有遗漏MVC的要点。MVC自然地划分为多个层。模型(DAL)、控制器(BLL)、视图(表示)。如果您愿意,这些可以放在不同的项目中,但由于控制器拥有所有业务逻辑,您只需要访问RoleProvider即可

然后,如果需要,应用存储库、模式等模式进一步拆分


Davy称MVC控制器为“UI”是不恰当的。。MVC中的“C”是BLL的一部分,即使它引用了您将称为BLL的类。然而,这不是你问题的重点

我想我可以通过问这样一个问题来解决这个问题:“你的‘UI’应用程序和你的‘BLL’应用程序是否真的需要100%分离?”。如果两个组件都对成员/角色提供程序有依赖关系,那么就让它这样吧,开始工作吧

在拔下BLL并插入新的BLL的情况下,可能对.NET提供程序具有共享依赖关系是可以接受的。你知道这可能没问题,你的应用程序可能不会崩溃


我认为乔在上面的回答很有道理……

我认为你现在做的很好

授权和身份验证应该位于服务层中,服务层可能会传递给控制器

如果控制器设置了主体和标识,然后通过使用MVC属性在控制器中使用,那么这听起来是个好主意


最好将MVC成员资格提供程序隐藏在接口后面,这样您就可以将其替换为WinForms成员资格提供程序(例如),并能够对控制器进行单元测试。

一定要在MVC中使用Authorize属性。您不需要手动检查IsInRole。问题是,除了我认为应该始终在BLL中的“IsInRole”或“Authorize”之外,我还需要处理其他业务逻辑。我很抱歉可以到处传递用户对象,但是为什么不省略Authorize,只使用BLL.Charles,thx作为回复呢。正如您所看到的,我必须处理一些业务逻辑,而不是基本的角色检查,以确定用户的真正安全性。我认为所有的BL都应该在BLL中,这就是为什么我计划在那里封装安全性。你是说上面的“IsRoleEditor”最好位于我的UI层而不是BLL中吗?-1我不同意:授权(无论是角色访问还是其他机制)绝对是BLL的责任。UI层可能正在客户端(例如Winforms)上运行,因此可以是com