是否有一个授权属性相当于.net的标准Web表单(而不是MVC)

时间:2010-11-18 17:09:43

标签: .net webforms roleprovider authorize-attribute

我正在开发一个使用Windows角色提供程序的项目,我想限制某些AD组的功能。

使用MVC,我可以在我的操作方法之上使用AuthorizeAttribute并相应地重定向。对于不使用MVC的标准Web表单应用程序(.NET 3.5),我能做些类似的工作吗?

3 个答案:

答案 0 :(得分:4)

您可以使用authorization元素在web.config中进行设置。

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

使用<authentication mode="Windows" />时,基本上域组已转换为角色。 你可以read more about it on MSDN

答案 1 :(得分:3)

我知道这是一篇很老的帖子,但我认为我会分享我的经验,因为我刚刚经历过这个。我不想使用web.config。我一直在寻找一种方法来创建类似于MVC实现的webforms属性。我找到了Deran Schilling的帖子,我用它作为属性部分的基础。

我创建了一个自定义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)
    {
    }
}

答案 2 :(得分:0)

在不指定角色的情况下在全局样式上设置通用 [Authorize] 属性的一个好方法是将以下代码放入项目的 web.config 中的 标记内。

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

这将只允许任何经过身份验证的用户访问该文档,并最终会触发重定向到身份验证页面。它相当于 MVC 中的通用 [Authorize]。