• 2019年6月21日

.net core通过IAuthorizationFilter进行权限控制

本文介绍的是.Net Core后台权限控制模块通过IAuthorizationFilter实现权限认证,属于入门级经验分享。

一个标准的网站应用程序含有权限系统,以前编写asp、php类的网站程序就需要对每个需要特定权限的程序进行权限检测,写相应的代码。

在.net core中我们可以通过IAuthorizationFilter进行权限管理

首先新建一个类,例如:AdminRequired.cs

using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
namespace Sample
{
    public class AdminRequired :  IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
           if(context.Filters.Any(it=>it is Microsoft.AspNetCore.Mvc.Authorization.IAllowAnonymousFilter))
            {

            }
            else
            {
                string userName = context.HttpContext.Session.GetString("username");

                if (string.IsNullOrEmpty(userName ))
                {
                    RedirectResult result = new RedirectResult("~/Login");
                    context.Result = result;
                }
                else
                {

                }
            }
        }
    }
}
  • OnAuthorization定义了权限检测,其中通过给context.Result赋值让程序进行相应的操作,例如RedirectResult是让浏览器转跳到指定页面,OkResult是返回200状态值(不做转跳操作),另外还有其他Result,各位可自行搜索。
  • 这里使用了Session,需要先在Startup.cs中定义:
public void ConfigureServices(IServiceCollection services)中添加

services.AddSession();

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 中添加

app.UseSession();

然后就可以在Controller中进行权限限制了,例如我们给AdminController.cs进行权限限定:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Authorization;
namespace MoMaMiBiao.Controllers
{
    [TypeFilter(typeof(Sample.AdminRequired))]  //声明Admin下面的方法如无例外都需要AdminRequired权限
    public class AdminController : Controller
    {
        public IActionResult Index()
        {
            return View("~/wwwroot/Admin/Index.cshtml");
        }
        public IActionResult Welcome()
        {
            return View("~/wwwroot/Admin/Welcome.cshtml");
        }
        [TypeFilter(typeof(AllowAnonymousFilter))]  //声明Login方法是完全开放,无需验证
        public IActionResult Login()
        {
            return View("~/wwwroot/Admin/Login.cshtml");           
         }
    }
}

在这里限定了除了声明了AllowAnonymousFilter的Login外访问都需要AdminRequired权限,根据OnAuthorization程序定义进行转跳或者其他操作。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注