はい、フォーム認証を使用してカスタムの自動化を行うことができますが、いくつかのカスタマイズを行う必要があります。
まず、AuthenticateRequest
アプリケーションのイベントをカスタマイズしてロールを操作するGlobal.asax
必要があるため、現在のユーザーに合わせてカスタマイズするコードを設定する必要があります。
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.User != null)
if (HttpContext.Current.User.Identity.IsAuthenticated)
if (HttpContext.Current.User.Identity is FormsIdentity)
{
var id = (FormsIdentity)HttpContext.Current.User.Identity;
var ticket = id.Ticket;
// Get the stored user-data, in this case, our roles
string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);
}
}
ユーザーを認証するときは、ロールを設定する必要があるため、コントローラーでは、次のようなコードを使用して認証への投稿アクションを行う必要があります。
if (LoginService.Validate(userame, password)
{
FormsAuthentication.Initialize();
var ticket = new FormsAuthenticationTicket(1,
username, //user
DateTime.Now, //begin
DateTime.Now.AddHours(3), //timeout
false, //remember?
permission, // permission.. "admin" or for more than one "admin,marketing,sales"
FormsAuthentication.FormsCookiePath);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
HttpContext.Current.Response.Cookies.Add(cookie);
}
その後、投稿のようなコードを使用できるようになります。
if (User.IsInRole("Admin"))
{ /** do something / }
または
if (User.IsInRole("Admin") || (User.IsInRole("Marketing") && User.IsInRole("Sales")))
{ /** do something / }
Authorize
asp.net mvcの属性で役割を確認することもできます。
[Authorize(Roles = "Admin")]
public class CompanyController : Controller
{
// actions
}
編集
権限「管理者」をいくつかの権限(コメントの編集、コメントの削除など...データベースのテーブルに保存できる)に関連付けるテーブルを作成できます。カスタムチェックパーミッションを実装するには、次のようなことを試してください。
public static class UserExtension
{
private static bool RoleHasPrivilege(string role, int privilege)
{
// performe a database/cache access to check if the role has the privilege
}
public static bool IsInRole(this IPrincipal user, string role, int privilege)
{
// check if the user authenticate has the "role" permission and the privilege is associate with this role...
return user.IsInRole(role) && RoleHasPrivilege(role, privilege);
}
}
そして、あなたは使うことができます:
if (User.IsInRole("Admin", 1))
{
// "Admins" has access
// 1 - can edit posts... for sample
}