我正在ASP.Net MVC上开发一个云应用程序。我在登录系统的实现方面遇到了问题。
我做了什么
我使用FormsAuthentication.SetAuthCookie(...)
登录网络用户。
和控制器中的Authorize
一样
[Authorize]
[HttpGet]
public ActionResult AdminPage(){...}
问题是什么
当我sign in
与网络用户credentials
并尝试访问管理员控制器时,它无法阻止该用户,他可以访问所有用户(包括管理页面)。
我应该使用什么类型的登录隐私来解决此问题。请务必记住security
。
我也看到了ASP.Net MemberShip Class
,但它自己生成了数据库。它可以模具化,并且可以与用户定义数据库一起使用。
答案 0 :(得分:2)
您可以在Authorize
属性上指定角色。
示例强>
[Authorize(Roles="Admin")]
这意味着只有具有admin角色的用户才能访问该方法。
如果您使用自定义角色,则需要创建Custom Role Provider
。这将允许您覆盖RoleProvider
方法并添加自己的逻辑。
示例强>
public class CustomRoleProvider : RoleProvider
{
public override bool IsUserInRole(string username, string roleName)
{
// Custom logic
}
public override string[] GetRolesForUser(string username)
{
// Custom logic
}
public override string[] GetAllRoles()
{
// Custom logic
}
}
详细教程可以在Custom Role Providers
找到答案 1 :(得分:1)
我不想偷走科林培根的回答。相反,我会添加一些额外的信息;我希望第二意见不会受到伤害。
您需要[Authorize(Roles = "Admin")]
才能限制对管理员角色的访问权限 -
[Authorize(Roles = "Admin")]
public ActionResult AdminPage(){...}
由于您的MVC应用程序已使用FormsAuthentication,因此您不需要使用MembershipProvider 。
但是,您需要实现自定义角色提供程序并覆盖GetRolesForUser方法(其余方法是可选的)。
基本上,当用户使用[Authorize(Roles = "Admin")]
访问操作时,AuthorizeAttribute将调用GetRolesForUser方法。
public class CustomRoleProvider : RoleProvider
{
public override string[] GetRolesForUser(string username)
{
// Query admin table.
if(user is in admin table)
return new[] {"Admin"};
return new[] {};
}
....
}
答案 2 :(得分:0)
首先在web.config中添加此(system.web)
<roleManager enabled="true" defaultProvider="simple">
<providers>
<clear />
<add name="simple" type="WebMatrix.WebData.SimpleRoleProvider,WebMatrix.WebData" />
</providers>
</roleManager>
<membership defaultProvider="simple">
<providers>
<clear />
<add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider,WebMatrix.WebData" />
</providers>
</membership>
然后将此行添加到Application_Start
中的Global.asaxWebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DefaultConnection",
"UserProfile", "UserId", "UserName", autoCreateTables: true);
然后你可以将用户添加到这样的角色
var roles = (SimpleRoleProvider)Roles.Provider;
roles.AddUsersToRoles(new[] { "username1", "username2", ... },
new[] { "role1", "role2", .... });
然后在控制器或方法上添加AuthorizeAttribute,如下所示
[Authorize(Roles="role1,role2,...")]