我刚刚使用.NetCore 2.2和实体框架创建了一个简单的web。
通过向用户访问的每个控制器传递一个userID,我添加了一点安全性。
但我注意到,当我不得不将userID添加到应用程序中的每个控制器,并运行我的用户检查以确保用户可以访问内容时,它开始变得混乱。
下面你会看到我的意思的一个例子。
我在想,有没有办法只添加一次,然后让每个控制器都检查一下?
谢谢!
[Route("api/[controller]")]
[ApiController]
public class EngineController : ControllerBase
{
private readonly engineMaker_Context _context;
public EngineController(engineMaker_Context context)
{
_context = context;
}
// GET: api/Engine
[HttpGet("{userID}")]
public async Task<ActionResult<IEnumerable<Engine>>> GetEngine(string userID)
{
if(!CanAccessContent(userID))
{
return Unauthorized();
}
return await _context.Engine.ToListAsync();
}
// GET: api/Engine/123/5
[HttpGet("{userID}/{id}")]
public async Task<ActionResult<Engine>> GetEngine(string userID, string id)
{
if(!CanAccessContent(userID))
{
return Unauthorized();
}
var engine = await _context.Engine.FindAsync(id);
if (engine == null)
{
return NotFound();
}
return engine;
}
// PUT: api/Engine/123/5
[HttpPut("{userID}/{id}")]
public async Task<IActionResult> PutEngine(string userID, string id, Engine engine)
{
if(!CanAccessContent(userID))
{
return Unauthorized();
}
if (id != engine.ObjectId)
{
return BadRequest();
}
_context.Entry(engine).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!EngineExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
private bool CanAccessContent(string userID)
{
return _context.AllowedUsers.Any(e => e.UserId == userID);
}
}发布于 2019-08-06 11:37:22
您可以尝试使用IAsyncAuthorizationFilter来检查userID。
IAsyncAuthorizationFilter公共类上下文:新的{公共任务OnAuthorizationAsync(AuthorizationFilterContext UserIdFilter ){ var IAsyncAuthorizationFilter = context.HttpContext.RequestServices.GetRequiredService();var userId = context.RouteData.Values"userID“as string;if (!dbContext.Users.Any(u => u.Email == userId)) { context.Result =IAsyncAuthorizationFilter UnauthorizedResult();}返回Task.CompletedTask;}}适用于所有类型的
UserIdFilter {action.services.AddMvc( => (UserIdFilter));}) .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);https://stackoverflow.com/questions/57362701
复制相似问题