ASP.net5中的授权

时间:2016-01-29 06:20:44

标签: c# asp.net asp.net-mvc asp.net-core asp.net-core-mvc

我正在尝试查看ASP.net5中是否存在“开箱即用”的内容,以便对我的应用程序需求进行授权。我正在使用基于组/权限的方法进行授权。使用Identity3我使用角色作为组,然后我已经创建了权限。每个权限都有一个链接到的资源以及一个或多个值,如:

资源=页面,权限=添加,更新,查看,删除

另一个复杂因素是这些组具有动态名称和动态权限!!

我已经开始阅读ASP.net5中的授权,似乎我找到了一些名为Policies的东西,听起来不错。它似乎强迫您使用声明,如果我使用ClaimsTransformer获取我的所有权限并将其添加为Db声明,则可以使用声明。但我是否正确地认为我必须为每个资源上的每个权限创建一个策略?这似乎很多设置。

我可以使用的ASP.net5中是否有任何我不知道的内容?像这样的属性

[Authorize("Page", "Delete")]

我可以添加到PageController Delete方法。

如果我必须使用某种服务和DI进入控制器来实现这一点,那么那也没关系。

4 个答案:

答案 0 :(得分:0)

ClaimsPrincipalPermissionAttribute符合您的要求。

或者您可以实施自己的AuthorizeAttribute

答案 1 :(得分:0)

我使用AspNet.Security.OpenIdConnect.Server进行授权。但您也可以查看OpenIddict

在任何情况下,您都可以将Authorize属性添加到您想要的任何方法

[Authorize(Roles = "Administrator,SimpleUser,AnOtherRole")]
public void MyMethod() {}

答案 2 :(得分:0)

Resource based authorization可能会满足您的需求,但我对作为资源的页面感到困惑,而不是页面的作用。

采用你的页面/删除组合,我认为你的页面删除操作不是资源是页面,而是一个参数,指示要删除的页面? (如果不是这种情况,那么这种方法当然不会起作用)

在这种情况下,您可以执行类似

的操作
[Authorize]
public class PageController : Controller
{
    IAuthorizationService _authorizationService;

    public PageController(IAuthorizationService authorizationService)
    {
        _authorizationService = authorizationService;
    }

    public Delete(int pageId)
    {
        var page = pageRepo.GetPage(pageId);
        if (await authorizationService.AuthorizeAsync(User, page,  Operations.Delete))
        {
            return View(page);
        }
        else
        {
            return new ChallengeResult();
        }
    }
}

为了实现这一点,您需要根据页面和操作要求(或任何旧要求,但参数化操作要求,您可以编写单个处理程序和相应的分支)来编写处理程序。

我们非常努力地避免将数据放入属性中,并将其移至需求中,因为属性中的数据坦率地说是维护噩梦。

还有一点需要注意;由于处理程序通过DI解决,您可以将用户注入权限解析器到处理程序中,这样可以避免使用声明转换。

答案 3 :(得分:-2)

ASP.NET提供了易于使用的开箱即用的身份验证机制,例如:

public class HomeController : Controller
{
    [Authorize]
    public ActionResult Index()
    {
        ViewBag.Message = "This can be viewed only by authenticated users only";
        return View();
    }

    [Authorize(Roles="admin")]
    public ActionResult AdminIndex()
    {
        ViewBag.Message = "This can be viewed only by users in Admin role only";
        return View();
    }
}

检查this tutorial

或者,如果您需要更复杂的机制,可以根据ASP.NET Membership Provider

实现自己的memberhsip提供程序
相关问题