我们有一个多租户 ASP.NET 应用程序。到目前为止,租户已相互隔离,但是现在我们拥有管理多个租户的代理,并希望能够使用单个用户帐户管理所有租户。我正在努力找出实现这一目标的最佳方法,希望不会对我们正在使用的现有技术进行太大改变。
相关技术细节:
我相信这些要求与 SQL Server 的安全模型非常相似。我们有一组登录名,代表可以登录系统的所有用户。用户应该能够被赋予一个或多个数据库(租户)的角色。示例:用户 Bob 在公司 A 中具有管理员角色,但在公司 B 中仅具有用户角色。我们还为我公司的员工提供“系统管理员”角色,允许我们访问任何租户以及专门的管理权限,例如创建/删除租户, 等等。
我对各种库、框架等进行了大量研究,但没有发现任何令人信服的证据表明其他库或框架会比我们目前拥有的更好。所以我目前正在考虑如何让 Sql Membership 提供者做我想做的事,除非有人能指出我更好的方向。我也不确定我知道在这方面搜索的最佳术语。
我有两个我正在考虑的选择:
这些选项中的任何一个都好吗?还是我应该到别处寻求支持?
我想为我自己的数据库使用asp.net成员资格提供程序我有自己的表
这是我做了什么 我扩展了会员提供者类与我自己的写所有重复的方法. 是否正确使用成员资格提供程序类进行自定义使用?我也扩展了角色管理课程.
好的,这是我的问题.我试图填充@Html.DropDownListFor()我的角色减去Admin角色.这很好用,但它显示了所有角色:
@Html.DropDownListFor(m => m.RoleName, new SelectList(Roles.GetAllRoles()))
Run Code Online (Sandbox Code Playgroud)
然而,这显示了所有角色,包括Adminroll.
所以我UserHelper.cs用这个方法创建了另一个类,基本上是这样的Roles.GetAllRoles():
public string[] GetUserRoles()
{
string[] userroles = null;
using (MainVeinDataDataContext conn = new MainVeinDataDataContext())
{
userroles = (from r in conn.Roles
where r.Rolename != "Admin"
select r.Rolename).ToArray();
}
return userroles;
}
Run Code Online (Sandbox Code Playgroud)
但是,作为MVC的新手,我不知道如何将此方法公开给视图中的DropDownList.所以无论我尝试什么,这都行不通:
@Html.DropDownListFor(m => m.RoleName, new SelectList(GetUserRoles()))
Run Code Online (Sandbox Code Playgroud)
我不确定我错过了什么,这让我发疯.希望那里有人知道我错过了什么.
我的角色提供者看起来像下面的类(删节).我在VS 2012上运行IIS Express和SQL 2012 Express,我在这个角色提供程序代码中得到了许多看似随机的异常.
public class Educ8RoleProvider : RoleProvider
{
private readonly Educ8DbContext _dbContext = new Educ8DbContext();
private readonly Authorization _authorization;
public Educ8RoleProvider()
{
_authorization = new Authorization(_dbContext);
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
try
{
base.Initialize(name, config);
}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(ex);
throw;
}
}
public override bool IsUserInRole(string username, string roleName)
{
return GetRolesForUser(username).Any(r => r.ToLower() == roleName);
}
public override string[] GetRolesForUser(string username)
{
return _authorization.GetRolesForMember(username).Select(r => r.Name).ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我Authorization …
asp.net-mvc entity-framework roleprovider ef-code-first asp.net-mvc-4
我想建立一个注册系统,在添加用户的同时,你可以选择你可以给他/她的角色类型.并且根据他/她的角色,将决定是否可以访问控制器中的某些动作.
例如,假设有两个角色,即管理员和开发人员.如下所述,只允许具有管理员角色的用户访问以下操作.
[Authorize(Roles = "admin"]
public ActionResult CreateUser()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我必须实施我的习惯RoleProvider或IPrincipal?我试图找到一些例子,但没有得到我正在寻找的东西.以下是我的RegisterModel目前的样子
public class RegisterModel
{
[Key]
public Guid Id;
[Required]
[Display(Name="First Name")]
public string FirstName {get; set;}
[Required]
[Display(Name="Last Name")]
public string LastName {get; set;}
[Required]
[Display(Name="Email Id")]
[DataType(DataType.EmailAddress)]
public string EmailId {get; set;}
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[Display(Name = "Password")]
[DataType(DataType.Password)]
public string Password { get; set; }
[Required]
[Display(Name = "Confirm Password")]
[DataType(DataType.Password)] …Run Code Online (Sandbox Code Playgroud) 我正在为我的控制器方法进行单元测试.在以下方法中,我想检查返回类型是否ViewResult
[HttpGet]
public ActionResult AddRepresentative(Guid businessUnitId)
{
var roles = Roles.GetAllRoles();
var model = new AddRepresentativeModel
{
BusinessUnitId = businessUnitId,
Roles = roles.Select(r => new SelectListItem
{
Value = r,
Text = r,
})
};
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
这就是我为测试所做的
[TestMethod]
public void AddRepresentative_Get_Action_RendersView()
{
var result = _controller.AddRepresentative(Guid.Empty);
Assert.IsInstanceOfType(result,typeof(ViewResult));
}
Run Code Online (Sandbox Code Playgroud)
错误:
测试方法AdminPortal.Tests.Controller_Test.Customer.BusinessUnitControllerTests.AddRepresentative_Get_Action_RendersView引发异常:System.Configuration.Provider.ProviderException:尚未启用角色管理器功能.
问题:在HttpGet方法中收集角色列表不是一个好习惯吗?
我需要在控制器或测试方法中进行一些更改才能使测试通过吗?
是否因为我正在使用RhinoMock而发生错误?
我需要一个具有以下功能的RoleProvider:
动态分配角色到任务
认证/授权IPrincipals基于他们有权访问的系统中的动态分配任务
报告显示当前登录的用户以及其他常见用法统计信息.
我很确定我将不得不自己动手,但我想确保我不会错过任何OSS甚至是MS.
我也在使用ASP.NET MVC,所以我的基本计划是编写一个自定义属性,如:[Authorize(Task=Tasks.DeleteClient)]
将它放在需要授权的方法上.我将根据用户在数据库中配置的任何设置,根据角色授权任务,而不是根据角色进行授权.
思考?