Условно скройте CommandField или ButtonField в Gridview

В этом случае невозможно ограничить S3 в отношении пользователей вашего приложения (не пользователей AWS), потому что S3 не имеет представления ни о каком таком конкретном пользователе. И не ваш пользователь удаляет контент из S3, а само ваше приложение, будь то приложение на EC2 или Lambda, для которого вам нужно указать роль IAM, чтобы он действительно мог это сделать.

Никакая конфигурация IAM вам здесь не поможет, так как вы можете разрешить экземпляру EC2 / Lambda удалить его или нет. Но это тот же EC2 / Lambda, независимо от того, какой пользователь инициировал запрос.

Единственный вариант здесь - защитить его через само приложение. Сохраняйте сопоставление между пользователями и их содержимым S3 в БД и выполняет проверку уровня приложения всякий раз, когда инициируется какой-либо запрос на удаление. Если вы правильно сконфигурируете свое приложение, то единственный способ удалить контент другого человека - получить доступ к своим учетным данным (или вашей учетной записи AWS с правами администратора S3). И если кто-то может выдать себя за другого, то никакая защита, предоставляемая AWS, в любом случае не может быть полезна (возможно, кроме защиты от удаления SFA MFA, но это не применимо для таких сценариев, как этот).

Для этого нужно создать жесткие контрольные примеры для вашего приложения, учитывая эту область, чтобы минимизировать вероятность потенциальной ошибки в приложении.

Вот некоторые другие предложения / лучшие практики, чтобы снизить вероятность злонамеренного / случайного удаления.

  1. использовать отдельные экземпляры для вашего веб-сервера и сервера БД.
  2. помещать БД в частную подсеть и разрешать только исходящее подключение к Интернету через экземпляр / шлюз NAT.
  3. разрешать только входящие. соединение из группы безопасности, связанной с вашим веб-сервером (возможно, SSH-соединение для административных целей, если вы не используете управляемую AWS БД - но только с определенного IP-адреса)
  4. хранят только хэши паролей ваших пользователей в БД
  5. позволяет управлять версиями в вашей корзине S3 . Таким образом, даже если объект в S3 удален (delete-marker создается как самая последняя версия объекта), вы всегда можете восстановите его, если необходимо
  6. убедитесь, что только аутентифицированные пользователи могут удалять вещи
26
задан Bob Kaufman 16 September 2012 в 13:26
поделиться

4 ответа

Сначала преобразуйте ваши ButtonField или CommandField в TemplateField, затем свяжите свойство кнопки Visible с методом, реализующим бизнес-логику:

<asp:GridView runat="server" ID="GV1" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:BoundField DataField="Age" HeaderText="Age" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button runat="server" Text="Reject" 
                Visible='<%# IsOverAgeLimit((Decimal)Eval("Age")) %>' 
                CommandName="Select"/>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Затем, в приведенном ниже коде добавьте метод:

protected Boolean IsOverAgeLimit(Decimal Age) {
    return Age > 35M;
}

Преимущество в том, что вы можете довольно легко протестировать метод IsOverAgeLimit.

59
ответ дан Marcel 28 November 2019 в 06:09
поделиться
<asp:GridView ID="gv_Document" CssClass="gridstyle" runat="server" OnRowDataBound="gv_Document_RowDataBound" AutoGenerateColumns="false" DataKeyNames="SourceGUID,Source,FilePath" ShowHeaderWhenEmpty="false" OnRowDeleting="gv_Document_RowDeleting">
   <Columns>
       <asp:BoundField HeaderText="ItemID" DataField="ItemID" ItemStyle-CssClass="hidden-field" HeaderStyle-CssClass="hidden-field" />
       <asp:BoundField HeaderText="SourceGUID" DataField="SourceGUID" ItemStyle-CssClass="hidden-field" HeaderStyle-CssClass="hidden-field" />
       <asp:BoundField HeaderText="Source" DataField="Source" ItemStyle-CssClass="hidden-field" HeaderStyle-CssClass="hidden-field" />
           <asp:TemplateField HeaderText="">
               <ItemTemplate>
                    <asp:HyperLink ID="hyperLink" runat="server" Target="_blank" NavigateUrl='<%# Bind("FilePath")%>'
                                                                Text='<%# Bind("FileName")%>'>  </asp:HyperLink>
               </ItemTemplate>
           </asp:TemplateField>
      <asp:BoundField HeaderText="Type" DataField="FileExtension" ItemStyle-CssClass="hidden-field" HeaderStyle-CssClass="hidden-field" />
      <asp:BoundField HeaderText="Content type" DataField="FileMimeType" ItemStyle-CssClass="hidden-field" HeaderStyle-CssClass="hidden-field" />
      <asp:BoundField HeaderText="File Path" DataField="FilePath" ItemStyle-CssClass="hidden-field" HeaderStyle-CssClass="hidden-field" />
      <asp:CommandField ShowDeleteButton="True" DeleteText="Delete" />
   </Columns>

Используйте этот код, чтобы отключить кнопку удаления в виде сетки из кода позади.

protected void gv_Document_RowDataBound(object sender, GridViewRowEventArgs e)
{ 
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        ((LinkButton)e.Row.Cells[7].Controls[0]).Visible = false;            
    }
}
1
ответ дан kboul 28 November 2019 в 06:09
поделиться

это могло быть сделано, когда срабатывает событие RowDataBound

  protected void GridView_RowDataBound(Object sender, GridViewRowEventArgs e)
  {
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      // Hide the edit button when some condition is true
      // for example, the row contains a certain property
      if (someCondition) 
      {
          Button btnEdit = (Button)e.Row.FindControl("btnEdit");

          btnEdit.Visible = false;
      }
    }   
  }

Вот демонстрационная страница

разметка

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DropDownDemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>GridView OnRowDataBound Example</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField HeaderText="Name" DataField="name" />
                <asp:BoundField HeaderText="Age" DataField="age" />
                <asp:TemplateField>
                    <ItemTemplate>                
                        <asp:Button ID="BtnEdit" runat="server" Text="Edit" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>

Код позади

using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;

namespace GridViewDemo
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.DataSource = GetCustomers();
            GridView1.DataBind();
        }

        protected override void OnInit(EventArgs e)
        {
            GridView1.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound);
            base.OnInit(e);
        }

        void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType != DataControlRowType.DataRow) return;

            int age;
            if (int.TryParse(e.Row.Cells[1].Text, out age))
                if (age == 30)
                {
                    Button btnEdit = (Button) e.Row.FindControl("btnEdit");
                    btnEdit.Visible = false;
                }
        }

        private static List<Customer> GetCustomers()
        {
            List<Customer> results = new List<Customer>();

            results.Add(new Customer("Steve", 30));
            results.Add(new Customer("Brian", 40));
            results.Add(new Customer("Dave", 50));
            results.Add(new Customer("Bill", 25));
            results.Add(new Customer("Rich", 22));
            results.Add(new Customer("Bert", 30));

            return results;
        }
    }

    public class Customer
    {
        public string Name {get;set;}
        public int Age { get; set; }

        public Customer(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
}

В демонстрации, Редактировать Кнопка не Видна (разметка HTML не отправляется клиенту) в тех строках, где возраст клиента 30.

13
ответ дан 28 November 2019 в 06:09
поделиться

Если бы это было основано на ролях, вы могли бы использовать панель многовидового режима, но не уверены, можете ли вы сделать то же самое в отношении свойства записи.

Однако вы можете сделать это с помощью кода. В событии с привязкой к строке вы можете скрыть или показать кнопку в нем.

0
ответ дан 28 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: