当前位置: 移动技术网 > IT编程>开发语言>.net > ASP.NET Core 2.1中基于角色的授权

ASP.NET Core 2.1中基于角色的授权

2018年08月21日  | 移动技术网IT编程  | 我要评论

攻心四美,购房按揭贷款计算器,苍南女民警汪茜茜

asp.net core 2.1中基于角色的授权

授权是来描述用户能够做什么的过程。例如,只允许管理员用户可以在电脑上进行软件的安装以及卸载。而非管理员用户只能使用软件而不能进行软件的安装以及卸载。它是独立的而又与验证配合使用,需要身份验证机制。对于应用程序来说,首先需要进行身份验证,然后进行进行授权。

作者:依乐祝
原文链接:https://www.cnblogs.com/yilezhu/p/9508267.html

identity是一个会员资格系统,它允许我们将登录功能添加到我们的应用程序中,身份可能属于一个或多个角色。例如,“user1”属于“admin”角色,“user2”属于“hr”的角色。
我们可以在我们的mvc或者web api应用程序中的控制器上使用authorizefilter特性来控制用户的访问。基于角色的授权可以检查登陆的用户是否有访问页面的权限。这里开发人员可以在他们的代码中加入角色。
下面我们使用一个例子来进行说明,我们将创建三个角色,对应的我们将建立三个用户。代码如下:

public void configure(iapplicationbuilder app, ihostingenvironment env, iserviceprovider serviceprovider)  
{  
    ....  
    ....  
    app.usemvc(routes =>  
    {  
        routes.maproute(  
            name: "default",  
            template: "{controller=home}/{action=index}/{id?}");  
    });  
  
    createroles(serviceprovider).wait();  
}  
  
private async task createroles(iserviceprovider serviceprovider)  
{  
    //initializing custom roles   
    var rolemanager = serviceprovider.getrequiredservice<rolemanager<identityrole>>();  
    var usermanager = serviceprovider.getrequiredservice<usermanager<identityuser>>();  
    string[] rolenames = { "admin", "user", "hr" };  
    identityresult roleresult;  
  
    foreach (var rolename in rolenames)  
    {  
        var roleexist = await rolemanager.roleexistsasync(rolename);  
        if (!roleexist)  
        {  
            //create the roles and seed them to the database: question 1  
            roleresult = await rolemanager.createasync(new identityrole(rolename));  
        }  
    }  
  
    identityuser user = await usermanager.findbyemailasync("jignesh@gmail.com");  
  
    if (user == null)  
    {  
        user = new identityuser()  
        {  
            username = "jignesh@gmail.com",  
            email = "jignesh@gmail.com",  
        };  
        await usermanager.createasync(user, "test@123");  
    }  
    await usermanager.addtoroleasync(user, "admin");  
  
  
    identityuser user1 = await usermanager.findbyemailasync("tejas@gmail.com");  
  
    if (user1 == null)  
    {  
        user1 = new identityuser()  
        {  
            username = "tejas@gmail.com",  
            email = "tejas@gmail.com",  
        };  
        await usermanager.createasync(user1, "test@123");  
    }  
    await usermanager.addtoroleasync(user1, "user");  
  
    identityuser user2 = await usermanager.findbyemailasync("rakesh@gmail.com");  
  
    if (user2 == null)  
    {  
        user2 = new identityuser()  
        {  
            username = "rakesh@gmail.com",  
            email = "rakesh@gmail.com",  
        };  
        await usermanager.createasync(user2, "test@123");  
    }  
    await usermanager.addtoroleasync(user2, "hr");  
  
}   

我们可以使用authorize属性的roles属性指定有权访问所请求资源的角色。例如,以下代码允许分配了“admin”角色用户进行访问的操作方法。

[authorize(roles = "admin")]  
public iactionresult onlyadminaccess()  
{  
    viewdata["role"] = "admin";  
    return view("mypage");  
} 

我们可以使用英文的逗号分割的角色列表来允许多个角色访问的方法。例如,在以下代码段中,操作方法只能由“admin”或“user”角色的用户访问。

[authorize(roles = "admin,user")]  
public iactionresult multipleaccess()  
{  
    viewdata["role"] = "admin";  
    return view("mypage");  
} 

我们也可以使用如下的代码来进行多角色的访问控制

[authorize(roles = "admin")]  
[authorize(roles = "user")]  
public iactionresult multipleaccess()  
{  
    viewdata["role"] = "admin";  
    return view("mypage");  
} 

基于策略的角色检查

我们还可以创建基于策略的访问控制。我们可以使用授权服务进行策略的添加以及注册。在下面的代码中,我们创建了一个只允许具有“admin”角色的用户才能进行访问的策略。

public void configureservices(iservicecollection services)  
{  
....  
....  
services.addauthorization(options =>  
   {  
       options.addpolicy("onlyadminaccess", policy => policy.requirerole("admin"));  
   });  
} 

我们可以使用authorize 特性的“policy ”属性进行策略的应用

[authorize(policy = "onlyadminaccess")]  
public iactionresult policyexample()  
{  
    viewdata["role"] = "admin";  
    return view("mypage");  
} 

使用这种策略方法我们也可以在razor页面中应用基于角色的授权。例如,如果我们有一个"test1.cshtml"的razor页面,而且这个页面只允许具有"admin"角色的用户访问,我们就可以使用下面的代码进行razor页面的授权访问控制。

public void configureservices(iservicecollection services)  
{  
    ...  
    ...  
    services.addmvc().addrazorpagesoptions(options =>  
    {  
        options.conventions.authorizepage("/test1", "onlyadminaccess");  
  
  
    }).setcompatibilityversion(compatibilityversion.version_2_1);  
  
    services.addauthorization(options =>  
    {  
        options.addpolicy("onlyadminaccess", policy => policy.requirerole("admin"));  
    });  
}  

总结

本文是对https://www.c-sharpcorner.com/article/role-base-authorization-in-asp-net-core-2-1/ 这篇文章的翻译,讲述了asp.net core 2.1中基于角色的授权,内容都很简单,浅显易懂!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网