我是mvc4 asp .net的新手,并且与身份验证和授权相混淆。我们的内部网站从Windows身份验证中获取用户名(HttpContext.Current.User.Identity.Name),如果用户名存在以及用户拥有什么角色,则检查数据库。我想使用全局[Authorize]属性和角色来访问控制器。任何人都可以帮助我如何开始。
目前,我有一个传递用户名并从数据库获取用户数据和相关角色的功能,查询数据被添加到模型中。所以,我使用此功能来访问网站,但我想要使用相同的数据来检查所有控制器和视图,而无需一直查询db。
答案 0 :(得分:17)
您只需要create a custom role provider。您可以通过创建一个继承自System.Web.Security.RoleProvider
并覆盖某些成员的类来完成此操作。以下代码可以帮助您入门。用您的函数实现替换所有throw new NotImplementedException()
内容。例如,IsUserInRole
您将提供用于查询数据库以查看用户是否处于指定角色的代码。
using System.Web.Security;
namespace MyNamespace
{
public class MyRoleProvider : RoleProvider
{
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 bool IsUserInRole(string username, string roleName)
{
throw new NotImplementedException();
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}
}
您可能不需要实现所有这些功能。例如,如果您的应用无法创建或删除角色,则无需对CreateRole
或DeleteRole
执行任何操作。
您还需要使用ASP.NET框架注册角色提供程序,以便它知道如何使用它。更新您的web.config
,如下所示。
<configuration>
<system.web>
<roleManager defaultProvider="MyRoleProvider" enabled="true">
<providers>
<add
name="MyRoleProvider"
type="MyNamespace.MyRoleProvider"
applicationName="MyApplicationName" />
</providers>
</roleManager>
</system.web>
</configuration>