0

WebMatrix で SimpleMembership を使用しています。イントラネット Web アプリケーションであるため、既存のドメイン ユーザーをカスタム ロールと組み合わせて使用​​し、それらをローカルの webpages_ テーブルに格納しています。ユーザーとロールを管理するクラスを開発しようとしています。おそらく私はこれについて間違った方法で進んでいますが、ここに私が持っているものと、私が立ち往生している場所があります.

これを 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>

Data Access クラス (コントローラーで使用)

  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 でエスケープされます。ユーザー名には domain\ 文字が含まれます。

/アカウント/削除/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 に答える