1

.NET MVC 4の最初のステップで、Webサイトを作成していて、ユーザーの認証/承認を実装したいと思います。

私の実装では、コントロールをロールにリンクできるようにしたいと思います。たとえば、システムに管理者とユーザーの2つの役割がある場合、一部のビューでは3つの入力があると表示されます。

            <input class="search-field rounded" id="field1" type="text"/>
            <input type="submit" name="submit"/>

            <input class="search-field rounded" id="field2" type="text"/>
            <input type="submit" name="submit"/>

            <input class="search-field rounded" id="field3" type="text"/>
            <input type="submit" name="submit"/>

管理者がこのビューの3つのフィールドすべてを表示および編集できるようにしたいのですが、ユーザーはそのうちの2つだけを表示し、そのうちの1つを編集できるようにする必要があります(これは単なる例です)。

したがって、基本的には、コントロールのアクセス許可を定義できるようにしたいので、ロールはアクセス許可のコレクションで構成する必要があります(より良いアプローチが考えられる場合は、それを聞いてみたいと思います)。

ですから、これらは私の制約であり、主題に関連するパッケージ(FluentSecuritySecurityGuardなど)がかなりありますが、どちらが私の課題に取り組むのが最善かはよくわかりません。

この需要を克服するためのベストプラクティスはありますか?

どんな助けでも大歓迎です。

4

3 に答える 3

2

idlehands23は、役割にアクセスして確認する方法を示していますが、この機能をビューレベルで使用したいと思います。

アクションメソッド内では、通常HttpContext.UserViewBagまたは強く型付けされたビューの場合は、プリンシパルをモデルに渡して、必要に応じてこれらの値を解析できます。次に、そのようにモデルをビューに渡します。

return View(new ModelClass(HttpContext.User))

ここから、ビューロジックにコードを追加して、役割を解析/チェックし、次の例を使用してhtmlをより具体的にレンダリングできます。

If (Model.User.IsInRole("Admin"))
{
    //Render admin controls
    //...
}
else
{
   //Render User Controls
   //...
}

アクションメソッドで属性を使用する[Authorize(Role="Admin||User")]と、ユーザーのグループ全体へのアクセスが制限されます。このような場合、コンテンツをレンダリングするには、2つのアクションメソッドと1つまたは場合によっては2つの異なるビューが必要になります。ただし、許可されたユーザーに限定したい場合は、次のようにすることができます。

    [Authorize]
    public ActionResult Index(){}

次に、それらが許可されていることを確認して、ビューレベルでロジックを実装できます。

于 2013-02-15T20:40:28.757 に答える
1

私はこのようにしました:

//In Controller
ViewBag.Roles = Roles.GetRolesForUser(User.Identity.Name);//viewbag because I'm assuming this isn't what you want to strongly type to your page.

//In View
@{
  var roles = (Roles)ViewBag.Roles;
} 
if(roles.contains("admin')) //put whatever you want in place of "admin"
{
    //do something
}

コントローラーでは、必要に応じて、//コントローラーで特定のビューまたは部分ビューへのアクセスを許可できます。
[Authorize(Roles = "Admin, ImportExport, Search")] //これはセキュリティのためだけです public ActionResult anything(){} *私はカミソリを使用します。そうでない場合は、@ を <% %> に置き換えてください。

于 2013-02-15T20:24:28.273 に答える
0

最終的に、独自のカスタムメンバーシッププロバイダーとロールプロバイダーを作成しました。

ロールプロバイダーにメソッドを追加しました

public bool UserHasPermission(string username, string permission) {...}

そして私の見解では、私は次のことを行っています。

@{
    var roleProvider = Roles.Provider as MyCustomRoleProvider;
    bool addressEditPermission = roleProvider.UserHasPermission(User.Identity.Name, "addressEditPermission");
}

次に、コントロールを操作できます。

@Html.TextBoxFor(model => model.Name, new { @readonly = addressEditPermission })

コントロールにHTML属性をとるオーバーロードがあることを確認する必要があります。

これが誰かに役立つことを願っています。

于 2013-02-20T10:13:06.647 に答える