将角色添加到 ADFS IPrincipal

Add roles to ADFS IPrincipal

几天来我一直在寻找这个问题的答案,但我没有找到任何成功的答案。我会 post 链接,但它可能会占据整个页面。

这就是我所拥有的...

我有一个 MVC 应用程序,它使用 WC-Federation 协议。我已经能够配置该应用程序,以便它对用户进行身份验证,并且 returns 来自 ADFS 的声明。这很完美。我也可以毫无问题地提取所有索赔。但我是在控制器的一个动作中这样做的。

这就是我想要做的...

我想使用 ADFS 对用户进行身份验证,但我想使用我自己的内部角色来授权用户访问特定的控制器(例如 [Authorize(Roles = "CoolRole")])。我希望能够做到这一点,因为我已经有一个使用 OAuth 2.0 的 Web API,后端 SQL 服务器数据库来管理用户和角色(内部和外部用户)。我现在想要一个安全门户,允许内部用户通过单点登录体验访问数据。查看 Controller 模型,我注意到有一些与身份验证过程相关的属性(OnAuthenticationOnAuthenticationChallenge)和一个与授权过程相关的属性(OnAuthorization。)

不一定需要代码,但总感觉碰砖了,需要指点一下。

更新

我试过这个:

protected override void OnAuthorization(
       System.Web.Mvc.AuthorizationContext filterContext)
{
    //Private class to create a new IPrincipal based on my AppUserMgr
    var user =  _setCurrentUser(
                  (ClaimsIdentity)filterContext.HttpContext.User.Identity);
    filterContext.HttpContext.User = user;

    base.OnAuthorization(filterContext);
}

这返回了 401(未授权)响应。

和...

protected override void OnAuthentication(
    System.Web.Mvc.Filters.AuthenticationContext filterContext)
{
    //Private class to create a new IPrincipal based on my AppUserMgr
    var user =  _setCurrentUser(
                  (ClaimsIdentity)filterContext.HttpContext.User.Identity);
    filterContext.Principal = user;

    base.OnAuthorization(filterContext);
}

这只是多次调用 STS,然后才失败。我什至尝试在分配之后交换到在两者都调用基础之后。运气不好。

在之前的那些之前,我也尝试过给控件添加一个AuthorizeFilter,但是没有帮助:

http://pratapreddypilaka.blogspot.in/2012/03/custom-filters-in-mvc-authorization.html

ADFS 是 Azure 中的 authentication/token 服务。要启用基于角色的身份验证,您可以使用 Azure RBAC(基于角色的访问控制)服务来基本上增强从 ADFS 返回的声明并将从 RBAC 返回的角色添加到令牌,并使用相同的令牌在您的 API 中,使用该增强令牌锁定或保护后端... 这是 RBAC 的参考资料:

http://azure.microsoft.com/en-in/documentation/articles/role-based-access-control-configure/

我找到这个 link:http://brockallen.com/2013/01/17/adding-custom-roles-to-windows-roles-in-asp-net-using-claims/

从那里,我猜到了我的路

以下是我所做的基础工作:

我最终覆盖了 Controller 的 OnAuthentication 方法,但仍然确保调用 base。我是在一个扩展 class 中完成的。这是概念:

public class AdfsController : Controller
{
    //Some code for adding the AppUserManager (used Unity)
    protected override void OnAuthentication(
            System.Web.Mvc.Filters.AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext);
        //Private method to set the Principal
        _setCurrentUser(filterContext.Principal);
    }

    private void _setCurrentUser(IPrincipal principal)
    {
        //Put code to find to use your ApplicationUserManager or 
        //dbContext.  roles is a string array

        foreach(var role in roles)
        {
            ((ClaimsIdentity)((ClaimsPrincipal)principal).Identity)
                .AddClaim(new Claim(ClaimTypes.Role, role));
        }
    }
}

在控制器中,您现在可以添加以下内容:

public class HomeController : AdfsController
{
    //I used a magic string for demo, but store these in my globals class
    [Authorize(Roles = "CoolRole")]
    public ActionResult Index()
    {
        return View();
    }
}

我通过检查分配给当前用户的角色对此进行了测试,并且成功了!然后我将角色更改为“拒绝”之类的角色,该角色未分配给用户;我收到了 401 Unauthorized。