0

記事ページを作成または編集するために GET または POST が呼び出されるたびに、次のメソッドを使用したいと考えています。

' userId = ID or username of the user logged in
' companyId = ID or name of the company for which the current blog is assigned
' blogId = ID or name of the blog for which the article is being written
' returnSuccessView = the view that will be returned if the user has access
' returnFailView = the view  that will be returned if the user does not have access

return View(CheckUserAccess(userId, companyId, blogId, returnSuccessView, returnFailView))

誰かがこの関数がどのように見えるかを教えてもらえますか? 私の構造は次のとおりです。

企業 -> ブログ -> 記事 -> コメント

特定の会社に属し、特定のブログに属し、特定の権限を持つユーザーのみが要求されたタスクを実行できるように、権限を作成したいと考えています。

たとえば、私のユーザー モデルには、ユーザーを関連付けることができる企業の ICollection があり、関連付けることができるブログの ICollection を持つことができます。また、スーパーユーザー、記事作成者、記事編集者、モデレーターなどの権限の ICollection を持つこともできます。

UI を介して追加および削除できるように、パーミッション用に別のモデルを作成します。

この関数は、要求された会社、ブログ、および権限が、ユーザーが関連付けられている (ICollection にある) ものと一致するかどうかを確認する必要があります。

このようなことを行う最善の方法は何ですか? ありがとうございました。

4

1 に答える 1

2

カスタム[Authorize]属性でこれを処理することをお勧めします。例を見てみましょう:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            // The user is not even authenticated => we can't get much further
            return false;
        }

        // At this stage we know that there's an authneticated user
        // let's see who he is by fecthing his username
        string username = httpContext.User.Identity.Name;

        RouteData rd = httpContext.Request.RequestContext.RouteData;

        // Now, let's read the companyId and blogId parameters that he sent
        // into the request and ensure that he is not cheating on us
        string companyId = rd.Values["companyId"] as string;
        string blogId = rd.Values["blogId"] as string;

        if (string.IsNullOrEmpty(companyId) || string.IsNullOrEmpty(blogId))
        {
            // One of the required parameters were not supplied when the action was invoked
            // => we can't get much further
            return false;
        }

        return IsOwner(username, companyId, blogId);
    }

    private bool IsOwner(string username, string companyId, string blogId)
    {
        // TODO: you know what to do here: 
        // check with your data store or wherever you have stored this info
        throw new NotImplementedException();
    }
}

これで、コントローラー/アクションをこの属性で装飾できます。

[MyAuthorize]
public ActionResult Edit(string companyId, string blogId)
{
    // if we got that far it means that the user is authorized to edit this blog post
    // and we could allow him to see the edit view
    EditViewModel model = ...
    return View(model); 
} 

もちろん、ユーザーが POST アクションでごまかそうとしないようにするために、次の属性で装飾することもできます。

[MyAuthorize]
[HttpPost]
public ActionResult Edit(EditViewModel model)
{
    // if we got that far it means that the user is authorized to edit this blog post
    // and we could go ahead and perform the necessary update
    ....
}
于 2012-07-27T15:34:56.420 に答える