Entity framework ASP.NET MVC-控制器中的用户授权
我的数据库中有一个表,其中包含用户的名称(带有域,例如:Domain1\user1)。我的项目具有Windows身份验证。我有两个控制器-一个用于所有登录用户,另一个用于特定用户。我的表有3列:(Id、Name、Extra),其中“Extra”仅为用户填充,用户是admin(它有varchar:“admin”)。Entity framework ASP.NET MVC-控制器中的用户授权,entity-framework,asp.net-mvc-4,authorization,Entity Framework,Asp.net Mvc 4,Authorization,我的数据库中有一个表,其中包含用户的名称(带有域,例如:Domain1\user1)。我的项目具有Windows身份验证。我有两个控制器-一个用于所有登录用户,另一个用于特定用户。我的表有3列:(Id、Name、Extra),其中“Extra”仅为用户填充,用户是admin(它有varchar:“admin”)。 我想创建这样的授权,其中只有管理员将有权访问第二个控制器的网站。怎么写 如有任何建议,我将不胜感激。 提前谢谢你的帮助 一元论 ===编辑==== 例如: 在我的主控制器中: [Aut
我想创建这样的授权,其中只有管理员将有权访问第二个控制器的网站。怎么写 如有任何建议,我将不胜感激。
提前谢谢你的帮助
一元论 ===编辑====
例如: 在我的主控制器中:
[AuthorizeUser(AccessLevel = "Extra")]
public class SecureController : Controller
{
(...)
}
public class AuthorizeUserAttribute : AuthorizeAttribute
{
public string AccessLevel { get; set; }
private Report_DBEnt REn = new Report_DBEnt();
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (!isAuthorized)
{
return false;
}
string privilegeLevels = string.Join("", REn.Users.Where(u => u.Extra.Equals("admin")).FirstOrDefault());
if (privilegeLevels.Contains(this.AccessLevel))
{
return true;
}
else
{
return false;
}
}
}
我尝试过这样使用它,但我无法访问我的网站。试试这个:
[AuthorizeUser(AccessLevel = "admin")]
public class SecureController : Controller
{
(...)
}
希望能有所帮助
更新
您必须创建自己的过滤器。我知道这一点。但我想通过搜索列Extra中的某一行来查找管理员用户-我不知道如何实现这一点。。。您提供的示例中的AccessLevel是什么?您可以将
AccessLevel
替换为Extra
Ok,那么我应该如何编写方法来从数据库中获取所需的内容呢?我看到我必须更改这一行:string privileglevels=string.Join(“,GetUserRights(httpContext.User.Identity.Name.ToString())代码>但是如何?当我想在它之前使用时:private Reports\u DBEnt REn=new Reports\u DBEnt()然后string privileglevels=string.Join(“,REn.Users…”)
它不起作用。在FilterConfig.cs
文件中,您应该添加自定义授权属性filters.add(new AuthorizeUserAttribute())代码>还不是全部。我想我有privileglevels
bad。我应该以某种方式使用httpContext.User.Identity.Name.ToString()
,不是吗?我尝试了string.Join(“,REn.Users.Where(u=>u.Name==httpContext.User.Identity.Name))代码>但我仍然没有访问权限。尝试在筛选器中放置断点,看看筛选器内部发生了什么。我添加:var user=httpContext.user.Identity.Name;var user2=REn.Users.Where(u=>u.Name==user.FirstOrDefault()代码>并且它们是正确的。但是字符串privileglevels
格式不正确,因为返回null。是您的httpContext.User.Identity.Name
与null
的不同之处吗?是的,它不是null。现在一切都好了D我忘了我必须使用选择(u=>u.Extra)
。谢谢!!!
public class AuthorizeUserAttribute : AuthorizeAttribute
{
public string AccessLevel { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(httpContext.User.Identity.IsAuthenticated)
{
string privilegeLevels = string.Join("",GetUserRights(httpContext.User.Identity.Name.ToString());
if (privilegeLevels.Contains(this.AccessLevel))
{
return true;
}
else
{
return false;
}
}
else
return false;
}
}
private string GetUserRights(string userName)
{
private Report_DBEnt REn = new Report_DBEnt();
return REn.Users.Where(u => u.UserName== userName).Select(u=>u.Extra);
}