gpt4 book ai didi

asp.net-mvc - MVC 角色授权

转载 作者:行者123 更新时间:2023-12-03 23:32:13 24 4
gpt4 key购买 nike

我正在尝试实现一种角色授权机制,该机制检查当前登录用户的角色,如果用户处于正确的角色,则允许他/她,否则显示错误 View 。

问题是,当用户尝试访问 Controller 中的以下方法时,他确实进入了 RoleAuthorizationAttribute 类并得到了验证,但 Controller 中的方法并未执行。

注意:用户具有客户端角色

Controller 方法

[RoleAuthorization(Roles = "Client, Adminsitrator")]
public ActionResult addToCart(int ProductID, string Quantity)
{
tempShoppingCart t = new tempShoppingCart();
t.ProductID = ProductID;
t.Username = User.Identity.Name;
t.Quantity = Convert.ToInt16(Quantity);

new OrdersService.OrdersClient().addToCart(t);
ViewData["numberOfItemsInShoppingCart"] = new OrdersService.OrdersClient().getNoOfItemsInShoppingCart(User.Identity.Name);
ViewData["totalPriceInSC"] = new OrdersService.OrdersClient().getTotalPriceOfItemsInSC(User.Identity.Name);
return PartialView("quickShoppingCart", "Orders");
}

角色认证类
[System.AttributeUsage(System.AttributeTargets.All,AllowMultiple = false, Inherited = true)]
public sealed class RoleAuthorizationAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{


List<String> requiredRoles = Roles.Split(Convert.ToChar(",")).ToList();

List<Role> allRoles = new UsersService.UsersClient().GetUserRoles(filterContext.HttpContext.User.Identity.Name).ToList();


bool Match = false;

foreach (String s in requiredRoles)
{
foreach (Role r in allRoles)
{
string rName = r.RoleName.Trim().ToString();
string sName = s.Trim();
if (rName == sName)
{
Match = true;
}
}
}

if (!Match)
{
filterContext.Result = new ViewResult { ViewName = "AccessDenied" };
}

base.OnAuthorization(filterContext);

}
}

你能告诉我我做错了什么吗

最佳答案

由于我在数据库中拥有用户的角色,因此我必须对照数据库进行检查,因此我将此方法包含在 global.asax 中

protected void Application_AuthenticateRequest(object sender, EventArgs args)
{
if (Context.User != null)
{
IEnumerable<Role> roles = new UsersService.UsersClient().GetUserRoles(
Context.User.Identity.Name);


string[] rolesArray = new string[roles.Count()];
for (int i = 0; i < roles.Count(); i++)
{
rolesArray[i] = roles.ElementAt(i).RoleName;
}

GenericPrincipal gp = new GenericPrincipal(Context.User.Identity, rolesArray);
Context.User = gp;
}
}

然后我可以使用正常的
[Authorize(Roles = "Client, Administrator")]

在 Controller 中的 actionResult 方法之上

这奏效了。

关于asp.net-mvc - MVC 角色授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22724798/

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