1

サイトに役割ベースの操作制限を実装したいと考えています。たとえば、投稿の作成者または一連のグループのみが投稿を編集できるように制限したいと考えています。

私は次のようなものを書くことができることを知っています:

     if (User.IsInRole("Admin"))
          return true;
     return post.Author.AccountId == currentAccountId;

しかし、ロールの固定名を使用せずに動的に実行できるかどうかは疑問です。管理者が新しい役割を追加できるコントロール パネルを作成したいと考えています。各役割の作成/変更フォームには、「他の投稿を編集できますか?」というチェックボックスがあります。その値に基づいて、上記のメソッドでアクションを実行します。私はPHPで何度もそれを行ってきましたが、これが私の最初のASP.NET MVCサイトであるため、デフォルトのSQLデータベース構造を使用できるかどうか疑問に思っています(新しいSimpleMembershipProviderでMVC4を使用していますが、必要に応じてカスタム プロバイダー)。

新しいクレーム機能について読んだことがありますが、この場合にそれを使用する方法がわかりませんでした。よろしいですか?

ネットで調べましたが、何もありませんでした...

どんな提案でも大歓迎です!ありがとう!

4

2 に答える 2

3

はい、フォーム認証を使用してカスタムの自動化を行うことができますが、いくつかのカスタマイズを行う必要があります。

まず、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 / }

Authorizeasp.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
}
于 2012-11-26T23:11:05.147 に答える
0

どういうわけか、Felipe Oriani が提案した解決策が機能しない

global.asax に実装され、メソッドを使用する場合

User.IsInRole("管理者")

常に false を返します。そこで、カスタム AuthorizeAttribute に実装する別の解決策を見つけました。

public class AuthenticateRequestAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        HttpContextBase context = httpContext;

    if (context.User != null)
        if (context.User.Identity.IsAuthenticated)
            if (context.User.Identity is FormsIdentity)
            {
                FormsIdentity id = (FormsIdentity)context.User.Identity;
                FormsAuthenticationTicket ticket = id.Ticket;

                string userData = ticket.UserData;
                string[] roles = userData.Split(',');
                context.User = new GenericPrincipal(id, roles);
            }
    return base.AuthorizeCore(httpContext);
}

}

このカスタム属性は、組み込みの [Authorize] 属性の代わりに使用できます

[AuthenticateRequest]
public class AuthorizedController: Controller
{

}

それなら間違いなく使えます

if (User.IsInRole("Admin"))
{ /** do something / }

お役に立てれば

于 2013-04-29T10:04:32.737 に答える