如何使用新的ASP.NET Identity 2.0角色和授权属性

本文关键字:角色 授权 属性 Identity 何使用 ASP NET | 更新日期: 2023-09-27 17:59:30

我正在使用新的ASP.NET Identity 2.0系统。我知道我可以检查用户是否扮演这样的角色:

bool isAdmin = UserManager.IsInRole(User.Identity.GetUserId(), 
   "Customer Account Admin");

我想这段代码可以在运行某些代码之前进行检查,但[Authorize]属性呢。我曾经可以说:

[Authorize(Role="Customer Account Admin")]

这已经不起作用了,因为我不再使用旧的会员资格或角色管理。我怎样才能把两者结合起来?或者,我如何防止应用程序的某些部分对正确角色的成员不可用?

伊迪丝1:我不相信它有效。我把下面的Authorize属性放在Admin页面上,我可以作为"客户帐户用户"执行代码

   [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);
                    }

第2版:我们在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");
                                }

当普通用户登录时,他们不会通过在地址栏中键入来获得Admin(管理)菜单

http://localhost:53620/Admin/default

我该如何阻止它?

第三版:我试图按照你的例子Eric阻止所有用户进入Admin页面,但我可以再次以客户用户的身份登录,仍然可以在地址栏中键入以上内容并进入该页面。这个有什么问题:

    <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>

第4版:切换到路径="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

如何使用新的ASP.NET Identity 2.0角色和授权属性

我已经进行了几次测试,但未能重新创建您的问题。我使用过有空格和没有空格的角色,以及多个角色。一切如预期。

你是如何添加角色的?我是这样做的。

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和网页。您使用的是WebForms(不是经典的asp.net或任何其他术语)。

有几种方法可以按角色保护页面,但最简单的方法是在web.config中使用location元素。再一次,这与它是ASP.NET Identity或旧式角色或其他什么无关。。。这一切都离不开作为基础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进行访问。

在Identity 3中,您可以使用以下内容:

[Authorize(ClaimTypes.Role, "Administrator")]

如果在Web.config文件中启用了角色管理器,如下所示:<roleManager enabled="true"/>你需要删除它。

我也遇到了同样的问题。我想使用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);

我有一个"Admin"值的索赔。我在API调用中使用它来向管理员用户返回不同的结果,它运行良好。

另一件奇怪的事情是,我尝试使用User.IsInRole("Admin"),但它不起作用。所以我猜AuthorizeAttribute使用了IsInRole。

我将使用声明检查编写自己的AuthorizeAttribute,但我更喜欢使用本机解决方案。

Clément