我遇到了在我的MVC应用上授权安全性的问题。我看到很多人使用AUTHORIZE,但我不确定如果我定义自定义角色,这是否有助于解决我的问题。我有一个用户的SQL表,每个用户都分配了我的MVC应用程序的角色(例如管理员,程序员,用户),他们的用户名是他们的Windows用户名。 Windows用户名在进入我的主页时被抓取,因此他们只能看到他们的东西,并且应该禁用某些功能(例如,在主页上禁用删除ActionLink,下拉框仅在编辑页面上填充特定值) 。现在我有一个LINQ查询检查存储库以查看它们是什么类型的用户。此外,管理员和程序员应该可以访问用户无法访问的另一个特殊页面。
最好的设计模式是创建两个单独的Index()/ Edit()页面还是创建Html帮助程序类来禁用/启用/隐藏ActionLinks和其他控件?对于特殊页面,如何实施安全性以限制未经授权的用户?感谢。
编辑:我在https://github.com/NickKip/ASPNETCustomMembershipExample 找到了一个很好的资源答案 0 :(得分:1)
您可以使用现有的AuthoriseAttribute
,但您应该执行的是自定义Principal
类,它将使用您自己的DB角色。在Principal
课程中,您将实现IsInRole方法:
public bool IsInRole(string role)
{
if(this.Roles == null)
this.Roles = DependencyResolver.Current
.GetService<ISecurityService>()
.GetUserPermissions(this.Identity.Name);
return this.Roles.Any(p => p.Name == role);
}
您应该在Global.asax
中设置自定义Principal
void OnPostAuthenticateRequest(object sender, EventArgs e)
{
// Get a reference to the current User
IPrincipal user = HttpContext.Current.User;
// If we are dealing with an authenticated forms authentication request
if (user.Identity.IsAuthenticated && user.Identity.AuthenticationType == "Forms")
{
// Create custom Principal
var principal = new MyCustomPrincipal(user.Identity);
// Attach the Principal to HttpContext.User and Thread.CurrentPrincipal
HttpContext.Current.User = principal;
System.Threading.Thread.CurrentPrincipal = principal;
}
}
您可以使用适当的Authorise
属性标记您的操作,并且可以在视图中使用User.IsInRole
来有条件地呈现链接。
答案 1 :(得分:0)
在这里发现了类似的问题和回应
ASP.NET MVC Alternatively Rendering EditorFor Based on User Role
我认为您使用html帮助程序来呈现视图是正确的。如果有人能提出一个更好的主意,那么最受欢迎。
MVC中的authorize属性具有提供角色的选项。这有助于我们限制对控制器成员的访问。 http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx#using_authorizeattribute