我正在使用Web API 2在ASP.NET MVC 5中实现的Web应用程序。
我通过将以下代码添加到web.config来实现集成Windows身份验证:
<system.web>
<authentication mode="Windows" />
</system.web>
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true"/>
</authentication>
</security>
</system.webServer>
并在我的控制器上添加[Authorize]
注释。
现在,我要求根据用户的角色访问某些功能。我有一个表格,我拥有用户权限,但我不知道如何创建这些角色,并将正确的权限与它们相关联。
任何帮助都将不胜感激。
提前致谢
[UPDATE]
根据梅森的回答,我稍微更新了代码。
在web.config中添加了以下行:
<roleManager defaultProvider="MyRoleProvider">
<providers>
<add
name="MyRoleProvider"
type="MyApp.App_Start.MyRoleProvider"
applicationName="My Tool" />
</providers>
</roleManager>
MyRoleProvider.cs:
public class MyRoleProvider : RoleProvider
{
private MyEntities db = new MyEntities();
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override string ApplicationName
{
get;
set;
}
public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}
public override string[] GetAllRoles()
{
throw new NotImplementedException();
}
public override string[] GetRolesForUser(string username)
{
throw new NotImplementedException();
}
public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override bool IsUserInRole(string username, string roleName)
{
vUser user = db.vUsers.Where(u => u.UserName == username).First();
if (roleName == "User")
{
if (user.IsAllowedToView == true)
{
return true;
}
else
{
return false;
}
}
else if (roleName == "Administrator")
{
if (user.IsAllowedToSubmit == true)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
public override bool RoleExists(string roleName)
{
if (roleName == "User" || roleName == "Administrator")
{
return true;
}
else
{
return false;
}
}
}
当我在我的控制器上使用[Authorize]
注释,并调用HttpContext.Current.User.Identity.Name
时,它会返回我用来登录我的机器的ID。 (AD的一部分)但是,如果我使用[授权(角色=&#34;用户&#34;)],它会一次又一次地询问我的用户名和密码,并且不接受任何内容。我把断点放在MyRoleProvider类的每一个方法上,但程序没有停在任何让我觉得可能它甚至没有调用提供者的程序。
答案 0 :(得分:0)
在每个控制器或甚至控制器内的每个方法中,您都可以添加自己的自定义授权角色。
Array()
注意: 角色必须以与插入数据库相同的方式编写。(案例敏感)
答案 1 :(得分:0)
如果您希望从Active Directory管理角色,您可以随时为每个特定角色创建Active Directory用户组,然后在控制器顶部使用[Authorize(Roles="{AD_GROUP_NAME}")]
注释。
答案 2 :(得分:0)
在您的特定情况下(基于聊天),听起来像基于角色的概念不适合您,因为您的权限存储在用户级别而不是角色级别,并且您不允许更改方式由于公司的限制而有效。
相反,您应该write your own filter可以应用于您的操作方法。该过滤器可能应该实现IAuthorizationFilter。这将允许你做类似的事情:
[RequirePermissions("Save")]
public ActionResult Save(Data date)
{
Database.Save(data);
return View("Success");
}
可能验证用户的逻辑是否应将该权限抽象为公共类,以便您也可以在视图中重用逻辑。
答案 3 :(得分:0)
public override string[] GetRolesForUser(string username)
{
var userrole = from role in db.roles
where username == role.userID
select role.role1;
if (userrole != null)
return userrole.ToArray();
else
return new string[] { };
//throw new NotImplementedException();
}
应编辑此功能。