Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET标识中实现权限?_C#_Asp.net_Asp.net Web Api_Permissions_Asp.net Identity - Fatal编程技术网

C# 如何在ASP.NET标识中实现权限?

C# 如何在ASP.NET标识中实现权限?,c#,asp.net,asp.net-web-api,permissions,asp.net-identity,C#,Asp.net,Asp.net Web Api,Permissions,Asp.net Identity,我们了解如何使用WebApi在ASP.NET标识中实现身份验证和授权。 例如,我们可以登录一个用户,然后检索他的安全令牌和角色 我们现在要添加权限。例如,用户steve可能担任admin角色。现在我们要为管理员角色分配读取、编辑和删除权限。我们如何在ASP.NET身份中做到这一点?ASP.NET Identity中是否存在权限基础结构?我们可以使用基于角色的授权 [Authorize(Roles = "Administrator")] public class StoreManagerContr

我们了解如何使用WebApi在ASP.NET标识中实现身份验证和授权。 例如,我们可以登录一个用户,然后检索他的安全令牌和角色


我们现在要添加权限。例如,用户steve可能担任admin角色。现在我们要为管理员角色分配读取、编辑和删除权限。我们如何在ASP.NET身份中做到这一点?ASP.NET Identity中是否存在权限基础结构?

我们可以使用基于角色的授权

[Authorize(Roles = "Administrator")]
public class StoreManagerController : Controller
{
    // Controller code here
}
我们可以为权限项创建枚举,如:

public enum PermissionItems
{ 
        [Group("Users")]
        [Description("Can edit Users")]
        EditUser,
        [Group("Users")]
        [Description("Can view Users")]
        ViewUser,
}
然后我们可以根据角色在数据库中添加这个枚举值

并按属性检入方法

RequirePermissions(PermissionItems.EditUser)
public ActionResult Edit(int id)
{  

}

我扩展了ASP.NET标识以允许您描述的权限。我这样做是为了将安全模型与应用程序模型分离。在authorized属性中放置角色的传统方法的问题是,您必须在设计应用程序的同时设计安全模型,如果进行任何更改,则必须重新编译和重新部署应用程序。使用我提出的方法,您可以在自定义属性中定义资源和操作,其中的操作类似于权限。现在您可以这样装饰方法:

[SimpleAuthorize(Resource = "UserProfile", Operation = "modify")]
public ActionResult ModifyUserProfile()
{
    ViewBag.Message = "Modify Your Profile";
    return View();
}
public class IdentityRole<TKey, TRolePermission>
{
    public string Title { get; set; }

    public virtual ICollection<TRolePermission> Permissions { get; set; }
}
public class IdentityPermission<TKey, TRolePermission>
{
    public virtual TKey Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }

    public virtual ICollection<TRolePermission> Roles { get; set; }
}
public class AuthorizePermissionAttribute : AuthorizeAttribute
{
    public string Name { get; set; }
    public string Description { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return base.AuthorizeCore(httpContext)
               && Task.Run(() => httpContext.AuthorizePermission(Name, Description, IsGlobal)).Result;
    }
}

然后,您可以将资源/操作分配给数据库中的角色,在部署期间配置您的安全模型,并且可以在不重新部署的情况下对其进行修改。我后来。文章中有指向完整源代码和参考应用程序的链接。

您应该扩展标识类,并将此功能添加到其中。角色和权限具有多对多的关系,因此您应该将IdentityRole类更改为以下内容:

[SimpleAuthorize(Resource = "UserProfile", Operation = "modify")]
public ActionResult ModifyUserProfile()
{
    ViewBag.Message = "Modify Your Profile";
    return View();
}
public class IdentityRole<TKey, TRolePermission>
{
    public string Title { get; set; }

    public virtual ICollection<TRolePermission> Permissions { get; set; }
}
public class IdentityPermission<TKey, TRolePermission>
{
    public virtual TKey Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }

    public virtual ICollection<TRolePermission> Roles { get; set; }
}
public class AuthorizePermissionAttribute : AuthorizeAttribute
{
    public string Name { get; set; }
    public string Description { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return base.AuthorizeCore(httpContext)
               && Task.Run(() => httpContext.AuthorizePermission(Name, Description, IsGlobal)).Result;
    }
}
您可以重写AuthorizeCore方法,将权限身份验证添加到基于角色的普通身份验证中。 虽然你可以很容易地做到这一点,但我将其作为一个开放源代码实现,你可以直接使用它,或者从中获得灵感,自己去做。

我发现链接是dotnet core的一个很好的方法,可以应用于dotnet框架。
在这种方法中,我们需要的所有东西都与在Identity内部实现的声明相关,不需要扩展Identity。

我想知道如何为这些角色添加离散权限。将这些权限离散化是否重要?使用ASP.NET MVC的基于角色的授权基础结构,您将处理/拒绝请求的责任从自己身上移开,从而减少了总体上需要编写的代码量。出于可维护性原因,我建议您不要编写超过需要的代码。将权限离散化非常重要,因为我们希望能够修改每个角色拥有的权限。您好Kevin,我正在尝试在我的ASP.NET应用程序中实现权限。您提供的链接指向一个空页面。我想知道你是如何实现权限的。你能提供正确的答案吗?链接到您在上述答案中暗示的资源?@OnsongoMoseti-文章指向一个已关闭的CodePlex项目。您可以从链接中的页面下载整个项目。但我也把它移到了GitHub。文章中的链接已更新到GitHub,您可以在此处访问。