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
他の誰かが以前にこれを行ったことがある場合は、おそらくこれらのクラスに別のアプローチを取ることについてのアドバイスを探しています。メンバーシップ プロバイダーとロール プロバイダーを使用する必要がありますか?