使用活动目录角色提供程序 MVC4 授权属性
Authorise attribute using active directory role provider MVC4
我目前正在使用 AspNetWindowsTokenRoleProvider 为我的控制器操作提供授权:
[Authorize(Roles = "domain\group")]
public ActionResult Index()
{
code.....
}
与其硬编码角色名称 ("domain\group"),不如使用常量。我想用调用设置 class 来替换它,这将从数据库或文件中获取它。
我认为要么有一种方法可以在提供程序中内置执行此操作,要么我需要用我自己的实现替换提供程序。
我画了一张空白的谷歌搜索,所以我想我问的问题不对!
任何人都可以指出我实现这一目标的正确方向。
谢谢
我已经解决了,所以这是解决方案,以防有人想做同样的事情。
- 创建一个新的 class 继承自 WindowsTokenRoleProvider
public class MyADProvider : WindowsTokenRoleProvider
{
//settings key
public const string Users = "Authorisation.AdGRoup.Users";
public const string Admins = "Authorisation.AdGRoup.Admins";
private ISettingsRepository settingsRepository;
public override string[] GetRolesForUser(string username)
{
// settings repository reads from settings file or DB
// actual implementation is up to you
this.settingsRepository = new SettingsRepository();
// get all the AD roles the user is in
var roles = base.GetRolesForUser(username);
List<string> returnedRoles = new List<string>
{
this.GetADRole(roles, Admins),
this.GetADRole(roles, Users)
};
return returnedRoles.ToArray();
}
private string GetADRole(string[] usersAdRoles, string roleSettingName)
{
//Get the actual name of the AD group we want from the settings
var settingName = this.settingsRepository.GetSetting(roleSettingName);
return usersAdRoles.Contains(settingName) ? roleSettingName : string.Empty;
}
}
然后更改 web.config 以使用新的 class:
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
<providers>
<clear />
<add name="AspNetWindowsTokenRoleProvider" type="MyADProvider" applicationName="/" />
</providers>
</roleManager>
然后我可以在代码中使用设置键:
[Authorize(Roles = MysADProvider.Admins)]
public ActionResult Index()
{}
我目前正在使用 AspNetWindowsTokenRoleProvider 为我的控制器操作提供授权:
[Authorize(Roles = "domain\group")]
public ActionResult Index()
{
code.....
}
与其硬编码角色名称 ("domain\group"),不如使用常量。我想用调用设置 class 来替换它,这将从数据库或文件中获取它。
我认为要么有一种方法可以在提供程序中内置执行此操作,要么我需要用我自己的实现替换提供程序。 我画了一张空白的谷歌搜索,所以我想我问的问题不对!
任何人都可以指出我实现这一目标的正确方向。 谢谢
我已经解决了,所以这是解决方案,以防有人想做同样的事情。
- 创建一个新的 class 继承自 WindowsTokenRoleProvider
public class MyADProvider : WindowsTokenRoleProvider
{
//settings key
public const string Users = "Authorisation.AdGRoup.Users";
public const string Admins = "Authorisation.AdGRoup.Admins";
private ISettingsRepository settingsRepository;
public override string[] GetRolesForUser(string username)
{
// settings repository reads from settings file or DB
// actual implementation is up to you
this.settingsRepository = new SettingsRepository();
// get all the AD roles the user is in
var roles = base.GetRolesForUser(username);
List<string> returnedRoles = new List<string>
{
this.GetADRole(roles, Admins),
this.GetADRole(roles, Users)
};
return returnedRoles.ToArray();
}
private string GetADRole(string[] usersAdRoles, string roleSettingName)
{
//Get the actual name of the AD group we want from the settings
var settingName = this.settingsRepository.GetSetting(roleSettingName);
return usersAdRoles.Contains(settingName) ? roleSettingName : string.Empty;
}
}
然后更改 web.config 以使用新的 class:
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
<providers>
<clear />
<add name="AspNetWindowsTokenRoleProvider" type="MyADProvider" applicationName="/" />
</providers>
</roleManager>
然后我可以在代码中使用设置键:
[Authorize(Roles = MysADProvider.Admins)]
public ActionResult Index()
{}