我工作在ASP.NET MVC 5的Web API 2如何使用角色与集成Windows身份验证
我已通过添加以下代码来实现网络集成Windows身份验证实现的Web应用程序。 config:
<system.web>
<authentication mode="Windows" />
</system.web>
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true"/>
</authentication>
</security>
</system.webServer>
并在我的控制器上添加[Authorize]
注释。
现在,我被要求根据用户的角色提供一些功能。我有一张表,我拥有用户权限,但我不知道如何创建这些角色,并将正确的权限与他们关联。
任何帮助,将不胜感激。
在此先感谢
[更新]
基于梅森的回答,我已经更新了代码位。
添加以下行的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的一部分)但是,如果我使用[Authorize(Roles =“User”)],它会一再询问我的用户名和密码,并且不接受任何内容。我把断点放在MyRoleProvider类的每一个方法上,但是程序并没有停下来,这让我觉得它甚至不会调用提供者。
看到我的答案[here](http://stackoverflow.com/a/32590333/1139830)。您只需要继承一个类,连接方法以从表中提取适当的数据,然后就可以开始在应用程序中使用这些角色。 – mason
@mason感谢您将我引导至该帖子。我已经实现了角色管理器,并添加到了我的web.config中。我现在的问题是我如何将用户ID传递给角色管理器。我在控制器的顶部有'[Authorize(Roles =“User”)]',但它不允许我查看它。如何将用户名参数传递给public override bool IsUserInRole(string username,string roleName)? – Jail
你不需要。当我们在web.config中注册我们的角色管理器时,就像我在答案中显示的那样,系统意识到了这一点。如果您要查看该“Authorize'属性的源代码,您将看到它代表您正在调用注册角色管理器(如果您想验证,请在角色管理器中设置断点)。因此,您无需手动获取用户名并将其传递给角色管理员。但是,如果你确实需要用户名,出于其他原因,这来自'HttpContext.Current.User.Identity.Name'。 – mason