C# 如何使用新的ASP.NET Identity 2.0角色和“授权”属性?
我正在使用新的ASP.NET Identity 2.0系统。我知道我可以检查用户是否担任以下角色:C# 如何使用新的ASP.NET Identity 2.0角色和“授权”属性?,c#,asp.net,asp.net-identity,C#,Asp.net,Asp.net Identity,我正在使用新的ASP.NET Identity 2.0系统。我知道我可以检查用户是否担任以下角色: bool isAdmin = UserManager.IsInRole(User.Identity.GetUserId(), "Customer Account Admin"); 我猜这段代码可以在运行某些代码之前进行检查,但是[Authorize]属性呢。我过去常说: [Authorize(Role="Customer Account Admin")] 这不再有效,因为我不再使用旧的
bool isAdmin = UserManager.IsInRole(User.Identity.GetUserId(),
"Customer Account Admin");
我猜这段代码可以在运行某些代码之前进行检查,但是[Authorize]属性呢。我过去常说:
[Authorize(Role="Customer Account Admin")]
这不再有效,因为我不再使用旧的成员资格或角色管理。我怎样才能把两者结合起来呢?或者,我如何防止应用程序的某些部分无法提供给具有正确角色的成员
Edit1:我认为它不起作用。我将下面的Authorize属性放在Admin页面上,我能够以“客户帐户用户”的身份执行代码
另外,我想阻止未经授权的用户看到该页面。我们有代码来阻止菜单,但我仍然可以键入管理员页面的URL,它可以被未经授权的用户看到
if (HttpContext.Current.User.IsInRole("Customer Account Admin"))
//
{
}
else
{
mi = radmenu1.Items.FindItemByText("Admin");
radmenu1.Items.Remove(mi);
}
EDIT2:我们在ASpNetRoles表中手动创建了角色,并将用户映射到ASPNetUsersToRoles表中的角色。有一个从用户到角色的映射,如“客户服务管理员”。我们通过以下方式将用户添加到角色,但我认为它不起作用:
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:我尝试根据您的示例阻止所有用户访问管理页面,但我可以再次以客户用户身份登录,仍然可以在地址栏中键入上述内容并访问该页面。这有什么问题吗
<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:切换到path=“Admin/default.aspx”会出现以下配置文件错误:
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
配置错误
描述:处理服务此请求所需的配置文件时出错。请查看下面的特定错误详细信息,并适当修改配置文件。
解析器错误消息:在应用程序级别之外使用注册为allowDefinition='MachineToApplication'的节是错误的。此错误可能是由于未在IIS中将虚拟目录配置为应用程序造成的。
源错误:
第66行:
第67行:
第68行:
第69行:
第70行:我已经执行了几个测试,但我无法重现您的问题。我使用了有空格和没有空格的角色,以及多个角色。一切都按预期进行
您如何添加角色?我是这样做的
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>());
roleManager.Create(new IdentityRole("This Is A Test"));
UserManager.AddToRole(user.Id, "This Is A Test");
var rolemanger=newrolemanger(newrolestore());
创建(新的IdentityRole(“这是一个测试”);
AddToRole(user.Id,“这是一个测试”);
更新:
ASP.NET有三个主要组件。。WebForms、MVC和网页。您使用的是WebForms(不是经典的asp.net或任何其他术语)
有几种按角色保护页面的方法,但最简单的方法是在web.config中使用location元素。再一次,这与它是ASP.NET身份或旧式角色或其他任何东西的事实无关。。。所有这些都是通过作为基本asp.net一部分的通用IPrincipal和IIdentity接口实现的。例如,以下允许所有管理员访问该站点,并拒绝所有其他用户,但允许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>
但是,请注意,如果您使用路由,则可能会将同一页面路由到两个不同的url,这意味着可以从一个url访问该页面,但如果您不小心使用权限,则无法从另一个url访问该页面。我也遇到了同样的问题。我想使用AuthorizeAttribute允许对管理员用户进行一些web api调用。
[Authorize]有效,但[Authorize(Roles=“Admin”)]无效。执行[Authorize(Roles=“Admin”)]的API调用非常长,然后出现SQL异常(无法连接)
我已经添加了角色经理的角色。在我的数据表中,管理员角色链接到我的用户
有点奇怪:角色在索赔中
如果我这样做:
var claimIdentity = (ClaimsIdentity)HttpContext.Current.User.Identity;
var roleClaims = claimIdentity.Claims.Where(c => c.Type == ClaimTypes.Role);
我有一个“Admin”值的索赔。我在API调用中使用它来向管理员用户返回一个不同的结果,它工作得很好
另一件奇怪的事情是,我尝试使用User.IsInRole(“Admin”)来代替,但它不起作用。所以我猜属性使用了IsInRole
我将使用声明检查编写自己的AuthorizeAttribute,但我更喜欢使用本机解决方案
Clément在标识3中,您可以使用:
[Authorize(ClaimTypes.Role, "Administrator")]
如果在Web.config文件中启用了角色管理器,如下所示:
您需要删除它。Yekes,这是一个不升级的绝好理由。如果不再有内置的方法,我假设您可以编写自定义属性。您的假设是错误的。Authorize属性适用于ASP.NET标识。原因是Authorize属性不适用于成员身份或标识,它适用于IPrincipal和IIdentity,这两种属性都是系统不可知的。您的问题很可能是因为您的名称中有空格或未启用角色。该错误告诉您问题“此错误可能是由于未将虚拟目录配置为IIS中的应用程序造成的”。在我看来,您的虚拟目录中有一个web.config未配置为应用程序。我在项目的帐户文件夹中有一个web.config,但我已将其删除。我无法摆脱这个问题。我在这里的一个SO帖子中遵循了所有的建议,但没有任何效果。我正在IIS Express中本地运行。我解决了问题。在这一点上,它与其他的不同。配置文件中有两个区域,它们是通过将ASpNetRoles放入表中手动创建的。我相信这就是RoleManager放他们的地方
[Authorize(ClaimTypes.Role, "Administrator")]