gpt4 book ai didi

asp.net-mvc - 将 MVC 基于用户和基于角色的授权应用于查看和操作

转载 作者:行者123 更新时间:2023-12-04 05:57:30 24 4
gpt4 key购买 nike

在 MVC 3 中,我试图弄清楚如何将基于角色和用户的安全性(并遵循最佳实践)正确应用于我的一个 View 。我有一个 View ,列出了任何给定“成员”(又名用户)的详细信息。我希望所有成员都能够查看任何其他成员的详细信息,但如果该成员正在查看自己的详细信息,我希望他们能够编辑自己的详细信息。此外,站点管理员应该能够编辑任何成员详细信息。

供大家引用,我的站点配置如下:

  • 我创建了自己的身份验证提供程序( 而不是 使用或覆盖 SqlMembershipProvider ),它非常简单并且使用表单例份验证。
  • 我覆盖了默认的 RoleProvider 来实现我自己的 IsUserInRole 和 GetRolesForUser 方法。两种方法都工作正常。
  • 我所有的 View 都使用从我的具体实体映射的“扁平化” View 模型。
  • 我的详细信息 View 用于 两者 显示信息编辑信息。使用标志(称为 IsInEditMode)(并传递到自定义 HtmlHelper)来确定是否仅显示数据或提供编辑器字段。我想保留这个单一的观点。

  • 这是我的具体要求。我在这个问题中列出了所有这些,因为我相信正确的答案将/应该解决所有这些问题(如果这不正确,请告诉我):
  • 成员应该能够查看任何其他成员的详细信息。
  • 成员(member)应该可以编辑大多数他们自己的细节,但他们细节的某些方面只能由站点管理员编辑(例如 状态 已批准或临时)
  • 属于“站点管理员”角色的成员可以编辑所有内容。
  • 详细 View 中的“编辑”按钮仅需要根据成员的角色(作为站点管理员)或使用登录凭据验证用户 ID/名称来显示。
  • Controller HttpPost Edit 操作需要验证用户是否被批准编辑。我知道我可以用像 [Authorize(Roles = "Site Administrator")] 这样的角色来装饰 Action ,但我不知道如何实现 OR UserBeingEdited == LoggedInUser属性。
  • 此外,我想防止恶意编辑,例如用户“摆弄”返回的用户 ID 值以及 XSS 和 CSRF 攻击。

  • 下面是我适用于 Controller 和 View 的代码(没有应用任何安全性)。任何建议表示赞赏!

    MemberController.cs 编辑操作 sippet:
    [HttpPost]
    [ValidateAntiForgeryToken]
    //TODO: Find out how to allow only "Site Administrator" roles OR the logged in user to edit their own information
    public ActionResult Edit(MemberDetailViewModel memberDetailViewModel)
    {
    if(ModelState.IsValid)
    {
    //TODO: Find out how to prevent member ID tampering (including XSS and CSRF attacks)
    var updatedMember = _memberServices.Find(memberDetailViewModel.MemberId);
    Mapper.Map(memberDetailViewModel, updatedMember);
    _memberRepository.InsertOrUpdate(updatedMember);
    return RedirectToAction("Detail", new {id = memberDetailViewModel.MemberId});
    }
    else
    {
    return View("Detail", _memberQueries.GetMemberDetailViewModel(memberDetailViewModel.MemberId, isInEditMode:true));
    }
    }

    成员(member)详情.cshtml 查看 (仅包含相关部分):
    @model MyApp.Web.Areas.Members.Models.MemberDetailViewModel
    @using (Html.BeginForm("Edit", "Member", FormMethod.Post, new { id = "memberDetailForm", enctype = "multipart/form-data" }))
    {
    <fieldset id="pageTitle">
    <h2>
    <!-- TODO: Only allow editing by "Site Administrators" or the verified logged in user -->
    @if (Model.IsInEditMode)
    {
    @:Editing @Model.FirstName @Model.LastName
    <a class="button" href="@Url.Action("Detail", new { id = @Model.MemberId })">Cancel</a>
    <input class="button" type="submit" value="Save" />
    @Html.HiddenFor(x => Model.MemberId)
    @Html.AntiForgeryToken()
    }
    else
    {
    @:Details for @Model.FirstName @Model.LastName
    <a class="button" href="@Url.Action("Edit", new { id = @Model.MemberId })">Edit</a>
    }
    </h2>
    </fieldset>
    <fieldset>
    <legend>Basic Information</legend>
    <table>
    <tr>
    <td class="label">
    First Name:
    </td>
    <td class="field">
    @Html.DisplayOrEditorFor(x => Model.FirstName, Model.IsInEditMode)
    @Html.ValidationMessageFor(x => Model.FirstName)
    </td>
    </tr>
    <!-- Other properties omitted -->
    <tr>
    <td class="label">
    Status:
    </td>
    <td class="field">
    <!-- TODO: This status field should only be editable by "Site Administrator", not the user -->
    @Html.DisplayOrEditorDropDownListFor(x => Model.StatusId, Model.StatusList, Model.IsInEditMode)
    </td>
    </tr>
    </table>
    </fieldset>
    }

    如果需要更好地理解我的观点,这里是我的样本 显示或编辑器为 自定义 HtmlHelper 函数:
    public static MvcHtmlString DisplayOrEditorFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, bool isInEditMode)
    {
    return isInEditMode ? System.Web.Mvc.Html.EditorExtensions.EditorFor(htmlHelper, expression) : System.Web.Mvc.Html.DisplayExtensions.DisplayFor(htmlHelper, expression);
    }

    最佳答案

    在您的情况下,最简单的解决方案是仅在编辑用户的 id == 当前用户的 id 或用户是管理员时才设置 IsInEditMode。

    您不想使用通用 Authorize 属性以外的任何其他内容,因为所有注册用户都可以访问该页面,因此您不需要或不需要在页面本身上进行额外的身份验证,仅在字段上,而这些字段由你的 IsInEditMode bool 值。

    您还可以对“编辑”链接进行测试,看看它是当前用户还是管理员,以及对只有管理员可以编辑的字段进行特殊测试。

    所以,你会做这样的事情:

    @Html.DisplayOrEditorDropDownListFor(x => Model.StatusId, Model.StatusList, 
    Model.IsInEditMode && User.IsInRole("Administrator"))

    是否处于编辑模式将在 Controller 中设置。如果它是当前用户或管理员,它只会允许将 EditMode 设置为 true。

    关于asp.net-mvc - 将 MVC 基于用户和基于角色的授权应用于查看和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9332816/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com