0

我正在将 SimpleMembership 与 WebMatrix 一起使用。由于它是一个 Intranet webapp,我将现有域用户与自定义角色结合使用,并将它们存储在本地网页表中。我正在尝试开发类来管理用户和角色。也许我正在以错误的方式解决这个问题,但这就是我所拥有的以及我被卡住的地方。

在 global.asa 中设置

 WebSecurity.InitializeDatabaseConnection("SqlRoleManagerConnection", "webpages_Users", "UserID", "Username", false);

在 web.config 中设置这个(其他消息来源说添加 roleManager=true 部分,但目前没有它也可以工作)

<!--<roleManager enabled="true" defaultProvider="SqlRoleManager">
  <providers>
    <clear />
    <add name="SqlRoleManager" type="System.Web.Security.SqlRoleProvider" connectionStringName="SqlRoleManagerConnection" applicationName="YourAppName" />
  </providers>
</roleManager>-->

<httpRuntime targetFramework="4.5" />
<authentication mode="Windows" />
<authorization>
  <allow roles="Managers" />
  <allow users="?" />
</authorization>

数据访问类(由控制器使用)

  public class Membership
{
    private OFACDB _db = new OFACDB();

    public string UserID { get; set; }
    public string UserName { get; set; }
    public string RoleName { get; set; }
    public string Name { get; set; }
    public const string Domain = "LAN\\";

    public void Delete()
    {
        Roles.RemoveUserFromRole(this.UserName, this.RoleName);
    }

    public void AddMemberToRole()
    {
        if (!Roles.IsUserInRole(Membership.Domain + this.UserName, this.RoleName))
            Roles.AddUserToRole(Membership.Domain + this.UserName, this.RoleName);
    }

    public void AddMember()
    {
        webpages_Users member = new webpages_Users();
        member.Username = Membership.Domain + this.UserName;
        _db.webpages_Users.Add(member);
        _db.SaveChanges();
    }

    public void DelMember(string id)
    {
        webpages_Users member = _db.webpages_Users.Find(id);
        _db.webpages_Users.Remove(member);
        _db.SaveChanges();
    }
}

public class MembershipViewModel : List<Membership>
{
    private OFACDB _db = new OFACDB();
    //public List<webpages_Users> UserView { get; set; }

    public IQueryable<webpages_Users> GetAllRecords()
    {
        var view = _db.webpages_Users
                .OrderBy(v => v.Username);
        return view;
    }

    public void GetAllRoleUsers(string role) //Get application's users
    {
        if (Roles.RoleExists(role))
        {
            foreach (var item in Roles.GetUsersInRole(role))
            {
                var user = new Membership();
                user.UserName = item;
                user.Name = item;
                user.RoleName = role;
                this.Add(user);
            }
        }
    }

    public void GetNetworkUsers() //Get Network Users (AD)
    {
        var domainContext = new PrincipalContext(ContextType.Domain);
        var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, "Domain Users");

        foreach (var item in groupPrincipal.Members)
        {
            var user = new Membership();
            user.UserName = item.SamAccountName;
            user.Name = item.Name;
            this.Add(user);
        }
    }
}

控制器按角色控制访问

        [Authorize(Roles = "Admins")]
    public ActionResult Index()
    {
        var users = new MembershipViewModel();
        users.GetAllRoleUsers("Managers");
        return View(users);
    }

建议?我使用 Roles.GetUsersInRole 列出角色中的用户,但我不能很容易地删除它们,因为此调用不返回 UserID,如果我使用用户名查找/删除记录,那么它会在 URL 中转义,因为用户名包含域\字符。

/帐户/删除/LAN%5CLAN%5Ctest

如果其他人以前这样做过,请寻求有关可能对这些课程采取不同方法的建议。我需要使用会员提供者和角色提供者吗?

4

2 回答 2

0

我们最近致力于一个需要角色管理的成员实现,并遇到了一个名为 Security Guard 的 nuget 包。

http://www.mvccentral.net/Story/Details/tools/kahanu/securityguard-nuget-package-for-asp-net-membership

我会马上注意到这个包不是为与 SimpleMembership 提供程序一起工作而构建的。SMP 包括一个基本的功能子集,这使得编辑用户记录变得困难。然而,尽管 SMP 的限制,我们仍然能够在自定义功能后结合本地注册、OAuth 注册和角色管理。

于 2013-01-30T21:34:59.450 回答
0

我只想发表评论,但我不能,因为我只有 44 分的代表。

我知道这很旧,但我一直在寻找同样的东西,并想在上面的评论中添加 @Vic 和 @Pabloker 之间的评论,@Vic 有他自己的数据库,@Pabloker 使用内置数据库。我猜 asp.net 在创建此数据库时有自己的脚本,并在此博客中进行了说明

cd \Windows\Microsoft.NET\Framework64\v4.0.30319
.\aspnet_regsql -C "Data Source=localhost;Database=ACME.Config;Integrated Security=True;" -A r
于 2015-04-02T21:56:49.540 回答