将角色添加到 ADFS IPrincipal
Add roles to ADFS IPrincipal
几天来我一直在寻找这个问题的答案,但我没有找到任何成功的答案。我会 post 链接,但它可能会占据整个页面。
这就是我所拥有的...
我有一个 MVC 应用程序,它使用 WC-Federation 协议。我已经能够配置该应用程序,以便它对用户进行身份验证,并且 returns 来自 ADFS 的声明。这很完美。我也可以毫无问题地提取所有索赔。但我是在控制器的一个动作中这样做的。
这就是我想要做的...
我想使用 ADFS 对用户进行身份验证,但我想使用我自己的内部角色来授权用户访问特定的控制器(例如 [Authorize(Roles = "CoolRole")]
)。我希望能够做到这一点,因为我已经有一个使用 OAuth 2.0 的 Web API,后端 SQL 服务器数据库来管理用户和角色(内部和外部用户)。我现在想要一个安全门户,允许内部用户通过单点登录体验访问数据。查看 Controller
模型,我注意到有一些与身份验证过程相关的属性(OnAuthentication
、OnAuthenticationChallenge
)和一个与授权过程相关的属性(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。
几天来我一直在寻找这个问题的答案,但我没有找到任何成功的答案。我会 post 链接,但它可能会占据整个页面。
这就是我所拥有的...
我有一个 MVC 应用程序,它使用 WC-Federation 协议。我已经能够配置该应用程序,以便它对用户进行身份验证,并且 returns 来自 ADFS 的声明。这很完美。我也可以毫无问题地提取所有索赔。但我是在控制器的一个动作中这样做的。
这就是我想要做的...
我想使用 ADFS 对用户进行身份验证,但我想使用我自己的内部角色来授权用户访问特定的控制器(例如 [Authorize(Roles = "CoolRole")]
)。我希望能够做到这一点,因为我已经有一个使用 OAuth 2.0 的 Web API,后端 SQL 服务器数据库来管理用户和角色(内部和外部用户)。我现在想要一个安全门户,允许内部用户通过单点登录体验访问数据。查看 Controller
模型,我注意到有一些与身份验证过程相关的属性(OnAuthentication
、OnAuthenticationChallenge
)和一个与授权过程相关的属性(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。