有没有适用于标准Web表单(非MVC)的AuthorizeAttribute等效项,用于.NET技术?

9
我正在开发一个项目,将使用Windows角色提供程序,并且我想将功能限制在特定的AD组中。
在MVC中,我可以在我的操作方法上方使用AuthorizeAttribute并相应地重定向。对于不使用MVC的标准Web Forms应用程序(.NET 3.5),是否有类似的操作方法?
3个回答

4
您可以在web.config中使用授权元素进行设置。
<configuration>
  <system.web>
    <authorization>
      <allow roles="domainname\Managers" />
      <deny users="*" />
    </authorization>
  </system.web>
</configuration>

基本上,当使用<authentication mode="Windows" />时,域组被翻译为角色。 您可以在MSDN上阅读更多信息


我明白了。但是是否有一种类似于MVC的方式可以限制特定方法级别的访问? - Blair Jones
@Blair Jones,恐怕你需要在方法内部进行类似于if(User.IsInRole("somerole"))的检查。 - Klaus Byskov Pedersen

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)
    {
    }
}

6
很抱歉,我认为这不是一个很好的例子。属性的构造函数中有代码,在 .NET 中,您无法控制属性何时实例化。此外,它们可能会被缓存。这意味着您在代码中依赖于 HttpContext 获取用户凭据,但它可能不是您所想象的上下文。虽然这在某些测试用例中可能有效,但存在未被预料到的失败可能性。 - AlexC
2
@AlexC,你有这段代码的替代方案吗?(WebForms) - Royi Namir
2
这段代码在WebForms中不起作用,也没有抛出任何HttpException。 - Emad Armoun

0

在全局范围内设置一个通用的[Authorize]属性的好方法,而不指定角色,是将以下代码放入项目的web.config文件中的<system.web>标签内。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接