asp.net-mvc - asp.net mvc core 在第一个操作完成之前对上下文启动了第二个操作
问题描述
我正在使用此代码对控制器进行授权。
和[Authorize(Policy = "CustomRole")]
事情发生了,在 3 或 4 个请求之后它失败了
在前一个操作完成之前在此上下文上启动了第二个操作
public class CustomRoleRequirement : AuthorizationHandler<CustomRoleRequirement>, IAuthorizationRequirement
{
public CMSContext _context = new CMSContext();
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomRoleRequirement requirement)
{
var routeobj = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
var c = routeobj.RouteData.Values.Values.ToList();
var keys = routeobj.RouteData.Values.Keys.ToList();
string area = "";
string id = "";
string controller = "";
string action = "";
string module = "";
foreach (var item in keys)
{
if (item=="area")
{
int indexs = keys.FindIndex(cc => cc == "area");
area = c[indexs].ToString();
}
else if (item == "id")
{
int indexs = keys.FindIndex(cc => cc == "id");
id = c[indexs].ToString();
}
else if (item == "controller")
{
int indexs = keys.FindIndex(cc => cc == "controller");
controller = c[indexs].ToString();
}
else if (item == "module")
{
int indexs = keys.FindIndex(cc => cc == "module");
module = c[indexs].ToString();
}
else if (item == "action")
{
int indexs = keys.FindIndex(cc => cc == "action");
action = c[indexs].ToString();
}
}
string modulelink = controller;
if (!string.IsNullOrEmpty(module))
{
modulelink = modulelink + "/" + module;
}
List<string> Roles = new List<string>();
int UserId = Auth.UserID;
string UserName = Auth.UserName;
if (UserName == "superadmin")
{
context.Succeed(requirement);
return Task.CompletedTask;
}
else
{
// apparently the error occurred here
var moduleobj = _context.AppModules.FirstOrDefault(q => q.Link == modulelink);
if (moduleobj != null)
{ // 69 role is assessing news module
//60 role is accessing page module
var RolesModulesobj = _context.AppRolesModules.FirstOrDefault(q => q.ModuleId == moduleobj.ModuleId && q.RolesId == Auth.RoleId);
if (RolesModulesobj != null)
{
string permissionsobj = RolesModulesobj.Permissions;
List<string> PermissionsListobj = permissionsobj.Split(',').Select(x => x.Trim()).ToList();
var FindFullAccess = PermissionsListobj.FirstOrDefault(q => q.Contains("FullAccess:true"));
if (FindFullAccess != null)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
else
{
var abc = PermissionsListobj.FirstOrDefault(q => q.Contains(action + ":true"));
if (abc != null)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
else
{
context.Fail();
return Task.CompletedTask;
}
}
}
}
}
错误发生在上面的这一行
var moduleobj = _context.AppModules.FirstOrDefault(q => q.Link == modulelink);
在上述方法中,如何在第二个操作开始之前让任务等待?
解决方案
您不能使用单例数据库上下文。您可以在每次需要时创建一个,或者将它们汇集在一起。
推荐阅读
- node.js - UnhandledPromiseRejectionWarning:错误:WHERE 参数“用户名”在邮递员中具有无效的“未定义”值
- javascript - InnerText 和 InnerHTML 值未定义,甚至值存在
- typescript - 如何修复命名空间“Joi”没有导出的成员“extractType”
- node.js - 具有异步意外无限循环的节点 JS
- dynamics-crm - MS CRM Online:获取拥有超过 X 个联系人的所有帐户
- python - 如何将dict附加到python中的dict并导出到json文件
- ckeditor - CKEditor 5 提及插件 - 将子元素附加到属性元素
- node.js - 使用特定节点版本与 Azure 一起部署静态 Web 应用程序
- android - 如何在 getter setter 方法中定义 Imageview
- c# - 当我单击第 2 页或无法在第 2 页应用过滤器时,过滤器正在重置