首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ID传递给控制器一次,并让所有控制器方法记住布尔检查

将ID传递给控制器一次,并让所有控制器方法记住布尔检查
EN

Stack Overflow用户
提问于 2019-08-06 00:36:58
回答 1查看 29关注 0票数 0

我刚刚使用.NetCore 2.2和实体框架创建了一个简单的web。

通过向用户访问的每个控制器传递一个userID,我添加了一点安全性。

但我注意到,当我不得不将userID添加到应用程序中的每个控制器,并运行我的用户检查以确保用户可以访问内容时,它开始变得混乱。

下面你会看到我的意思的一个例子。

我在想,有没有办法只添加一次,然后让每个控制器都检查一下?

谢谢!

代码语言:javascript
复制
[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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-08-06 11:37:22

您可以尝试使用IAsyncAuthorizationFilter来检查userID

  1. 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;}}适用于所有类型的

  • 注册器类型(options UserIdFilter {action.services.AddMvc( => (UserIdFilter));}) .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57362701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档