我正在使用新的ASP.NET Identity 2.0系统。我知道我可以检查用户是否有这样的角色:
bool isAdmin = UserManager.IsInRole(User.Identity.GetUserId(),
"Customer Account Admin");
我想这个代码可以在运行某些代码之前编写以检查,但是[Authorize]属性呢。我曾经能说:
[Authorize(Role="Customer Account Admin")]
这不再适用,因为我不再使用旧的会员资格或角色管理。我怎么把两者放在一起?或者我如何防范应用程序的某些部分无法供正确角色的成员使用?
编辑1:我不相信它正在发挥作用。我在管理页面上放置了以下Authorize属性,并且我能够以"客户帐户用户身份执行代码"
[Authorize(Roles = "Customer Service Admin, Savitas Admin")]
public partial class _default : System.Web.UI.Page
另外,我想阻止该页面被未经授权的用户看到。我们有阻止菜单的代码,但我仍然可以输入管理页面的URL,未经授权的用户可以看到它
if (HttpContext.Current.User.IsInRole("Customer Account Admin"))
//
{
}
else
{
mi = radmenu1.Items.FindItemByText("Admin");
radmenu1.Items.Remove(mi);
}
EDIT2:我们在ASpNetRoles表中手动创建了角色,并将用户映射到ASPNetUsersToRoles表中的角色。用户与#34;客户服务管理员等角色之间存在映射。我们将用户添加到角色中,但我不相信它有效:
if (manager.AddToRole(manager.FindByName(UserName.Text).Id, "Customer Account Admin").Succeeded)
{
c.logActivity("Register.aspx.cs", "REG_USER_ROLE", "Setting user to Admin role succeeded");
}
当普通用户登录时,他们不会通过在地址栏中输入管理员页面来获取管理员菜单:
http://localhost:53620/Admin/default
如何阻止它?
Edit3:我尝试按照您的示例Eric阻止所有用户访问管理员页面,但我再次以客户用户身份登录,仍然在地址栏中输入上述内容并进入该页面。这有什么不对:
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
<connectionStrings>
...
</connectionStrings>
<location path="~/Admin/default.aspx">
<system.web>
<authorization>
<allow roles="Customer Service Admin" />
<deny users="*"/>
</authorization>
Edit4:切换到路径=&#34; Admin / default.aspx&#34;给出以下配置文件错误:
Configuration Error
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
Parser Error Message: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.
Source Error:
Line 66: </controls>
Line 67: </pages>
Line 68: <membership>
Line 69: <providers>
Line 70: <!-- ASP.NET Membership is disabled in this template. Please visit the following link http://go.microsoft.com/fwlink/?LinkId=301889 to learn about the ASP.NET Membership support in this template
答案 0 :(得分:7)
我已经进行了多次测试,但我无法重现您的问题。我已经使用了有空格和没有空格的角色,以及多个角色。一切都按预期工作。
您是如何添加角色的?以下是我的表现方式。
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>());
roleManager.Create(new IdentityRole("This Is A Test"));
UserManager.AddToRole(user.Id, "This Is A Test");
更新:
ASP.NET有三个主要组件:WebForms,MVC和Web Pages。您正在使用WebForms(不是经典的asp.net或任何其他术语)。
有几种方法可以按角色保护页面,但最简单的方法是使用location元素在web.config中执行此操作。再一次,它没有没有与ASP.NET身份或旧式角色或其他任何事实有关...它都是通用的IPrincipal和IIdentity接口的工作原理基础asp.net。例如,以下内容允许所有管理员访问该站点并拒绝所有其他用户,但允许MyUsers角色中的用户访问CoolStuff.aspx:
<configuration>
<system.web>
<authorization>
<allow roles="Administrators" />
<deny users="*"/>
</authorization>
</system.web>
<!-- Allow all "MyUsers" role users to access CoolStuff.aspx -->
<location path="CoolStuff.aspx">
<system.web>
<authorization>
<allow roles="MyUsers" />
</authorization>
</system.web>
</location>
</configuration>
请注意,如果您正在使用路由,则可能会将同一页面路由到两个不同的网址,这意味着可以从一个网址访问该网页如果你不小心你的权限,而不是另一个。
答案 1 :(得分:2)
在Identity 3中,您可以使用:
[Authorize(ClaimTypes.Role, "Administrator")]
答案 2 :(得分:2)
如果您在Web.config文件中启用了roleManager,请执行以下操作:
<roleManager enabled="true"/>
你需要删除它。
答案 3 :(得分:1)
我遇到了同样的问题。我想使用AuthorizeAttribute允许一些web api调用管理员用户。 [授权]有效,但[授权(角色=“管理员”)]没有。使用[Authorize(Roles =“Admin”)]执行的API调用很长,然后我有一个SQL异常(无法连接)。
我已经在角色管理器中添加了角色。在我的数据表中,Admin角色已链接到我的用户。
有一些奇怪的东西:角色在声明中。
如果我这样做:
var claimIdentity = (ClaimsIdentity)HttpContext.Current.User.Identity;
var roleClaims = claimIdentity.Claims.Where(c => c.Type == ClaimTypes.Role);
我的声明具有“管理员”价值。我在API调用中使用它来向管理员用户返回不同的结果,并且它工作正常。
另一个奇怪的事情是我尝试使用User.IsInRole(“Admin”)而它不起作用。所以我猜AuthorizeAttribute使用IsInRole。
我将使用声明检查编写自己的AuthorizeAttribute,但我更喜欢使用本机解决方案。
克莱门特