有没有办法在运行时更改属性的参数? 我有一项服务,我在其中分配可以访问该服务的角色。我想在运行时分配这些角色。
[HttpGet]
[Authorize(Roles="admin")]
public DataTable GetAllProducts()
{
FormToken auth = new FormToken();
DataTable dt = new DataTable();
if (!auth.isAuthenticated())
{
dt.Columns.Add("Error");
DataRow dr = dt.NewRow();
dr["Error"] = "Login to get the Service";
dt.Rows.Add(dr);
return dt;
}
var rec = from log in db.Products select log;
return rec.ToDataTable();
答案 0 :(得分:1)
的Vivek,
可以继承authorize属性,您可以覆盖OnAuthorize方法。像下面的东西。
public sealed class AuthorizationAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//do custom authorization here
base.OnAuthorization(filterContext);
}
}
此时,您可以执行任何您希望授权的操作。您可以添加自定义构造函数来设置自己的变量。例如,我目前使用此覆盖来检测用户是否已获得授权,并且他们可以访问特定位置。
干杯
答案 1 :(得分:1)
@Nico提出的方法可行。
可以提供更好的封装和灵活性的替代方案是使用ClaimsPrincipalPermissionAttribute
而不是AuthorizeAttribute
。这是WIF的一部分,理论上它是.Net中身份和授权的首选框架。
在此模型中,ClaimsPrincipalPermissionAttribute
根据资源和操作指定请求的授权上下文 - 即描述请求,而不是谁可以访问请求。< / p>
然后将实际授权逻辑封装在给定当前用户主体和授权上下文的自定义ClaimAuthorizationManager
中。它的工作纯粹是进行授权检查。可以通过应用程序web.config文件中的配置来控制ClaimAuthorizationManager
。
这就是这里所描述的
虽然我更喜欢这种方法,但我认为非常强有理由偏爱另一种方法。我认为这种方法的优点是:
ClaimsPrincipalPermission.CheckAccess("Customer","Add"))
缺点是
Microsoft.IdentityModel
,而不是System.IdentityModel
正如我所说,在我看来,这主要是一个偏好问题。
答案 2 :(得分:0)
对于非声明性用户权限验证,您可能需要考虑使用System.Security.Permissions.PrincipalPermission
而不是AuthorizeAttribute
。这将允许您在运行时指定目标角色。根据您的身份验证方式,您可能需要确保将经过身份验证的用户主体分配给Thread.CurrentPrincipal
PrincipalPermission
使用的HttpContext.Current.User
,而不是AuthorizeAttribute
(这是什么) MVC {{1}}使用)。