ASP.Net MVC的安全工具包
本文关键字:安全 工具包 MVC Net ASP | 更新日期: 2024-07-27 07:53:24
我实际上正在用NHibernate开发一个带有ASP.Net MVC的网站我需要管理组、页面和其他内容的权限我希望我的角色、权限、操作、组以及所有类似的东西都在我的数据库中。
就像一篇旧帖子一样,我想知道Ayende Rhino Security工具包是否仍然相关,或者是否有其他相关的通用工具包?
对于我的新项目,我使用了身份系统
http://www.asp.net/identity
ASP.NET标识系统旨在取代以前的ASP.NET成员身份和简单成员身份系统。它包括配置文件支持、OAuth集成、与OWIN配合使用,并包含在Visual Studio 2013附带的ASP.NET模板中。
特别是这个教程帮助了我很多第一次
http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-1
您也可以考虑MembershipReboot。据我所知,它仍然超越了Asp.Net Identity,尽管它最初是为了克服Membership的缺点。
关于Rhino Security工具包,我不知道它处于哪个状态。
下面是我做的一个例子
步骤1-为用户创建声明
var identity = new ClaimsIdentity(
new[] {
new Claim(ClaimTypes.Name, usr.Name),
new Claim(ClaimTypes.Email, usr.Email),
new Claim(ClaimTypes.Role, usr.Roles.FirstOrDefault().Role),
new Claim("StuffXId", usr.StuffXId + ""),
new Claim("StuffYId", usr.StuffYId + "")
}
, "BMMC"//"ApplicationCookie"
);
foreach(AccessLevels x in usr.AccessLevels)
identity.AddClaim(new Claim("AccessLevel", x.Access));
步骤2-我创建了我的类BMClaimsAuthorize
public class BMClaimsAuthorize : AuthorizeAttribute
{
public string ClaimType { get; set; }
public string Value { get; set; }
public BMClaimsAuthorize() { }
public BMClaimsAuthorize(string ClaimType, string Value)
{
this.ClaimType = ClaimType;
this.Value = Value;
}
protected override bool AuthorizeCore(HttpContextBase context)
{
return context.User.Identity.IsAuthenticated
&& context.User.Identity is ClaimsIdentity
&& ((ClaimsIdentity)context.User.Identity).HasClaim(x =>
x.Type == ClaimType && x.Value == Value);
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
filterContext.Result = new RedirectResult("~/Account/DeniedAccess");
}
}
3-使用peject。BMTools(导入我的库)
[BMClaimsAuthorize("AccessLevel", "General")]
public ActionResult Index()
{
ViewBag.Name = CurrentUser.Name;
ViewBag.Email = CurrentUser.Email;
ViewBag.StuffX = CurrentUser.ValueOf("StuffXId");
return View();
}
我创建了自己的cotroller类(它继承自控制器),帮助我轻松获得用户声明
CurrentUser.Name
但那是另一个话题。。
这是我的实际代码,我有两个表,其中用户被映射到一个角色并加速
角色只告诉他们是否是管理员(作为一个表而不是一个用户字段保存,以防我以后需要多个角色),他们位于只有管理员才能访问的控制器类的顶部。
AccessLevel告诉其他一切(它们按方法过滤)。如果您需要更复杂的东西,您可以添加更多声明(如我的AccessLevel声明),并编辑BMClaimsAuthorize和AuthorizeCore方法以满足您的标准。
例如,让它接受一个字符串数组,这样你就可以发送这样的
[BMClaimsAuthorize("AccessLevel", {"General","Admin","other"...})]
希望这能有所帮助!