【发布时间】:2019-08-15 22:17:08
【问题描述】:
我试图弄清楚如何在 .Net Core 2.1 应用程序中处理请求之前使用授权过滤器来授权用户。
我公司的用户在使用需要身份验证的内部 Web 应用程序时会通过 SSO 服务器重定向。然后,SSO 服务器将请求转发到 Web 应用程序,请求标头中包含身份验证和授权信息。目前,我的所有控制器操作方法都包含一个条件语句,用于检查请求标头中提供的用户角色是否包含执行操作所需的任何可能角色。使用授权过滤器似乎是一种更简洁的方法,但是尽管我看过所有文档和教程,但我仍然无法弄清楚如何实现该技术。
这是我目前用来检查用户是否有权执行某项操作的方法:
using System;
namespace MyApp
{
public static class Authorization
{
public static bool IsAuthorized(string usersRoles, params string[] authorizedRoles)
{
if (usersRoles != null)
{
foreach (string authorizedRole in authorizedRoles)
{
if (usersRoles.Contains(",MYAPP?" + authorizedRole))
{
return true;
}
}
}
return false;
}
}
}
下面是一个控制器方法的示例,它将用户角色从请求标头和可能的角色列表传递给“IsAuthorized”方法,以检查用户是否有权执行该操作:
public IActionResult Index()
{
if (!Authorization.IsAuthorized(Request.Headers["COMPANYACCESSROLES"], "TYPE1_USER", "TYPE2_USER", "TYPE3_USER"))
{
ViewData["Message"] = "Not Authorized";
return View("MyAppMessage");
}
// Do stuff to complete the action requested here
return View();
}
请求标头中包含的角色如下所示:
SOMEAPP,SOMEAPP?SOMEROLE1,SOMEAPP?SOMEROLE2,MYAPP,MYAPP?TYPE2_USER,MYAPP?TYPE2_RO,ANOTHERAPP,ANOTHERAPP?ANOTHERROLE1
我希望能够删除我目前在每个控制器方法开头的条件语句,并改用这样的授权过滤器:
[Authorize(Roles = "TYPE1_USER", "TYPE2_USER", "TYPE3_USER")]
public IActionResult Index()
{
// Do stuff to complete the action requested here
return View();
}
任何帮助将不胜感激。
【问题讨论】:
-
Request.Headers["COMPANYACCESSROLES"]与安全无关。它表明客户端可以设置它想要的任何角色,而服务器将无法检测到更改。在 Authorization 标头中设置不记名令牌会更安全。在这种情况下,您可以根据需要使用 Authorize 属性为每个控制器/方法指定允许的角色。作为documented. -
请求标头中提供的访问角色来自对我公司的用户进行身份验证的 SSO 服务器。我已经更新了我的问题以使其更清楚。
标签: c# .net-core authorization