asp.net - 在 ASP.NET MVC 中构建自定义授权

标签 asp.net asp.net-mvc c#-4.0 authorization custom-attributes

DB 中,我有 RoleUser 具有一对多关系的实体。

我想做的是构建自定义授权过滤器。我看到的所有教程都使用默认的 ASP.NET 成员身份。我所知道的是我需要继承 AuthorizationAttribute 但不知道我需要覆盖哪些方法以及如何实现它们。

public class UserAuth : AuthorizeAttribute
{

}

数据库中:

作用

public class Role
{
    [Key]
    public int RoleID { get; set; }

    [Required]
    public int RolenameValue { get; set; }

    [MaxLength(100)]
    public string Description { get; set; }

    // // // // //

    public Rolename Rolename 
    {
        get { return (ProjectName.Domain.Enums.Rolename)RolenameValue; }
        set { RolenameValue = (int)value; }
    }

    public virtual ICollection<User> Users { get; set; }
}

用户

public class User
{
    [Key]
    public int UserID { get; set; }

    [Required]
    [MaxLength(30)]
    public string Username { get; set; }

    [Required]
    [MinLength(5)]
    public string Password { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [MaxLength(30)]
    public string FirstName { get; set; }

    [MaxLength(50)]
    public string LastName { get; set; }

    [DataType(DataType.Date)]
    public DateTime Birthdate { get; set; }

    public int GenderValue { get; set; }

    // // // // // // //

    public Gender Gender
    {
        get { return (ProjectName.Domain.Enums.Gender)GenderValue; }
        set { GenderValue = (int)value; }
    }

    public int RoleID { get; set; }

    [ForeignKey("RoleID")]
    public Role Role { get; set; }

最佳答案

您不需要创建自定义属性。您可以使用现有的 AuthoriseAttribute,但您应该做的是实现自定义 Principal 类,该类将使用您自己的 DB 角色。在您的 Principal 类中,您将实现 IsInRole 方法:

public bool IsInRole(string role)
{
    if(this.Roles == null)
        this.Roles = DependencyResolver.Current
           .GetService<ISecurityService>()
           .GetUserPermissions(this.Identity.Name);

    return this.Roles.Any(p => p.Name == role);
}

您应该在 Global.asax 中设置您的自定义 Principal

    void OnPostAuthenticateRequest(object sender, EventArgs e)
    {
         // Get a reference to the current User 
        IPrincipal user = HttpContext.Current.User; 

        // If we are dealing with an authenticated forms authentication request         
        if (user.Identity.IsAuthenticated && user.Identity.AuthenticationType == "Forms") 
        { 
            // Create custom Principal 
            var principal = new MyCustomPrincipal(user.Identity); 

            // Attach the Principal to HttpContext.User and Thread.CurrentPrincipal 
            HttpContext.Current.User = principal; 
            System.Threading.Thread.CurrentPrincipal = principal; 
        }
    } 

关于asp.net - 在 ASP.NET MVC 中构建自定义授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10754073/

相关文章:

javascript - 将数据发送到部分 View

asp.net-mvc-3 - 在嵌入式 MongoDB 文档中强制生成新的 _id

.net - 表达式树不能包含动态操作

c# - 将查询字符串参数传递给第二页

c# - 如何在行项目之间添加空格

asp.net-mvc - 没有为文件调用 VirtualPathProvider

c# - 我们可以在 Windows 应用程序中使用 Jquery 吗?

asp.net - 使用 Azure Blob 存储中的 ascx 文件

asp.net - 带有自定义 slugs 的 .NET MVC-4 路由

c# - Entity Framework 包含 where 子句