C# 如何使用新的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")] 这不再有效,因为我不再使用旧的

我正在使用新的ASP.NET Identity 2.0系统。我知道我可以检查用户是否担任以下角色:

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")]