gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:42:21 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com