существует ли атрибут authorizeattribute, эквивалентный только стандартным веб-формам (не MVC) для .net

Я работаю над проектом, который будет использовать поставщиков ролей Windows, и я хочу ограничить функциональность определенными группами AD.

С MVC я мог бы использовать AuthorizeAttribute над своими методами действий и соответствующим образом перенаправить. Есть ли что-то подобное, что я могу сделать для стандартного приложения веб-форм (.NET 3.5), которое не использует MVC?


person Blair Jones    schedule 18.11.2010    source источник


Ответы (3)


Вы можете настроить это в web.config с помощью элемента авторизации.

<configuration>
  <system.web>
    <authorization>
      <allow roles="domainname\Managers" />
      <deny users="*" />
    </authorization>
  </system.web>
</configuration>

В основном доменные группы преобразуются в роли при использовании <authentication mode="Windows" />. Вы можете узнать больше об этом в MSDN.

person Klaus Byskov Pedersen    schedule 18.11.2010
comment
правильно я получил это. Но есть ли способ ограничить доступ на уровне определенного метода, подобно тому, как вы можете сделать это с помощью MVC? - person Blair Jones; 18.11.2010
comment
@ Блэр Джонс, боюсь, вам придется выполнить проверку типа if(User.IsInRole("somerole")) в методе. - person Klaus Byskov Pedersen; 18.11.2010

Я знаю, что это старый пост, но решил поделиться своим опытом, поскольку я только что прошел через это. Я не хотел использовать web.config. Я искал способ создать атрибут для веб-форм, аналогичный реализации MVC. Я нашел сообщение Деран Шиллинг, которое я использовал как основа атрибутивной части.

Я создал собственный IPrincipal

interface IMyPrincipal : IPrincipal
{
    string MyId { get; }
    string OrgCode { get; }
    string Email { get; }
}

и главный

public class MyPrincipal : IMyPrincipal
{
    IIdentity identity;
    private List<string> roles;
    private string email;
    private string myId;
    private string orgCode;

    public MyPrincipal(IIdentity identity, List<string> roles, string myId, string orgCode, string email)
    {
        this.identity = identity;
        this.roles = roles;
        this.myId = myId;
        this.orgCode = orgCode;
        this.email = email;
    }

    public IIdentity Identity
    { 
        get { return identity; }
    }

    public bool IsInRole(string role)
    {
        return roles.Contains(role);
    }

    public string Email
    {
        get { return email; }
    }
    public string MyId
    {
        get { return myId; }
    }
    public string OrgCode
    {
        get { return orgCode; }
    }
}

и создал атрибут для использования на странице

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class AdminAuthorizationAttribute : Attribute
{
    public AdminAuthorizationAttribute()
    {
        var user = (MyPrincipal)HttpContext.Current.User;

        if (user.IsInRole("MyAdmin"))
            return;

        throw new AccessDeniedException();
    }
}

и создал несколько пользовательских исключений

public class AccessDeniedException : BaseHttpException
{
    public AccessDeniedException() : base((int)HttpStatusCode.Unauthorized, "User not authorized.") { }
}

public class BaseHttpException : HttpException
{
    public BaseHttpException(int httpCode, string message) : base(httpCode, message) { }
}

и теперь я могу применить атрибут для использования на данной странице

[AdminAuthorization]
public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}
person m4chine    schedule 22.04.2013
comment
Боюсь, это не очень хороший пример. В конструкторе атрибута есть код, в .NET вы не можете контролировать, когда создаются экземпляры атрибутов. Кроме того, они могут кэшироваться. Это означает, что HttpContext, на который вы полагаетесь в своем коде для учетных данных пользователя, может не быть тем контекстом, о котором вы думаете. Это может работать в некоторых тестовых примерах, но может привести к неожиданному сбою. - person AlexC; 22.11.2013
comment
@AlexC у вас есть альтернатива этому коду? (веб-формы) - person Royi Namir; 14.10.2014
comment
этот код не работает в WebForms, он не генерирует исключений HttpException. - person Emad Armoun; 23.12.2017

Хороший способ установить общий атрибут [Authorize] на глобальном моде без указания роли — поместить следующий код в web.config проекта внутри тега ‹system.web›.

<authorization>
   <deny users="?" />
   <allow users="*" />
</authorization>

это позволит только любому аутентифицированному пользователю получить доступ к документу и в конечном итоге вызовет перенаправление на страницу аутентификации. Это эквивалент общего [Authorize] в MVC.

person antoprd    schedule 11.06.2021