权限认证

 

1、继承IAuthorizationFilter接口

using GWHomeBigData.Cache;
using GWHomeBigData.Model;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
using System.Net;
using System.Security.Claims;

namespace GWHomeBigData.Statistics.WebApi.Filter
{
    public class AuthFilter: IActionFilter, IAuthorizationFilter//AuthorizeFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
        }
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            //允许匿名访问
            if (context.HttpContext.User.Identity.IsAuthenticated ||
                context.Filters.Any(item => item is IAllowAnonymousFilter))
                return;
            var cache = context.HttpContext.RequestServices.GetService<ICache>();
            var _context = context.HttpContext;
            var claimsIdentity = _context.User.Identity as ClaimsIdentity;
            var _request = _context.Request;
            var _authorization = _request.Headers["Authorization"].ToString();
            if(_authorization!=null && _authorization.Contains("BasicAuth"))
            {
                //获取请求头中传递的ticket
                var current_ticket = _authorization.Split(" ")[1];
                string _key = Model.Util.GetRedis("token", current_ticket);
                var user = cache.Get<SysUserInfo>(_key);
                if (user==null)
                {
                    _context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                    context.Result = new JsonResult(new {Ok=false,Error="token失效"});
                    return;
                }
                context.HttpContext.Items.Add("userInfo", user);
                context.HttpContext.Items.Add("redisUserKey",_key);
                return;
            }
            _context.Response.StatusCode =(int)HttpStatusCode.Unauthorized;
            context.Result = new JsonResult(new { Ok = false, Error = "token无效" });
        }
    }
}

2、Startup全局注册过滤器

public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            string _timeOutStr = Configuration["HttpRequest.TimeOut"];
            if (!int.TryParse(Configuration["HttpRequest.TimeOut"], out HttpRequest.Timeout))
            {
                HttpRequest.Timeout = 5000;
            }
            services.AddCors(options =>
            {
                options.AddPolicy("any", builder =>
                {
                    builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials();
                });
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddJsonOptions(options => options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver());
            services.AddMvc(m => {
                m.Filters.Add(typeof(AuthFilter));
            });
            services.AddScoped<PermissionFilter>();
            return RegisterAutofac(services);
        }

3、登陆接口允许匿名登陆

/// <summary>
        /// 登陆
        /// </summary>
        /// <param name="loginModel"></param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpPost]
        public IActionResult Post([FromBody]LoginModel loginModel)
        {
            try
            {
                string url =configuration["HttpRequestUrl.Report"] +"api/UserReport/login";
                string parm = JsonConvert.SerializeObject(new {name=loginModel.Name,pwd=loginModel.Pwd});
                string r = GWHomeReport.Util.HttpRequest.HttpPost(url, parm);
                if (string.IsNullOrWhiteSpace(r))
                {
                    return Ok(new {Ok=false,Error="用户名不存在或者密码错误!"});
                }
                var sysUserInfo = JsonConvert.DeserializeObject<SysUserInfo>(r);
                string _token = Guid.NewGuid().ToString("N");
                sysUserInfo.Token = _token;
                if (sysUserInfo.Power == 1)
                    sysUserInfo.CurrentAdmDivCode = sysUserInfo.AdmDivCode.Substring(0, 2);
                else if(sysUserInfo.Power == 2)
                    sysUserInfo.CurrentAdmDivCode = sysUserInfo.AdmDivCode.Substring(0,4);
                var user = new SysUserInfo { Name = "admin", Token = _token };
                string _key = Model.Util.GetRedis("token", _token);
                cache.Insert(_key, sysUserInfo, DateTime.Now.AddHours(2));
                #region 获取用户子部门
                string getChildUnitUrl = configuration["HttpRequestUrl.Report"] + "api/sys/childunit";
                string getChildUnitParam = JsonConvert.SerializeObject(new { UnitCode= sysUserInfo.UnitCode });
                string childUnitStr = GWHomeReport.Util.HttpRequest.HttpPost(getChildUnitUrl, parm);
                string _childUnitKey = Model.Util.GetRedis("childunit", sysUserInfo.Name, sysUserInfo.UnitCode);
                cache.Insert(_childUnitKey, childUnitStr, DateTime.Now.AddHours(2));
                #endregion
                return Ok(new { Ok=true,Data= sysUserInfo });
            }
            catch (Exception ex)
            {
                logger.LogError(ex.Message);
            }
            return NoContent();
        }

4.1、前端代码-登陆,写入cookie

$(function () {
    $("#btnSubmit").on("click", function () {
        var name = $("#name").val();
        var pwd = $("#pwd").val();
        var data = { Name: name, Pwd: pwd };
        var url = commonData.rqDomain + "api/login";
        $("#loginMsg").text("");
        if ($.trim(name) == "" || $.trim(pwd) == "") {
            $("#loginMsg").text("用户名或者密码不能为空!");
            return;
        }
        AjaxPostData(url, data, function (data) {
            if (data && data.Ok && data.Data) {
                window.location.href = "index.html";
                $.cookie(commonData.cookieName, JSON.stringify(data.Data));
                return;
            }
            var errorMsg = "";
            if (data && !data.Ok) {
                errorMsg = data.Error;
            }
            $("#loginMsg").text(errorMsg);
        },true);
    });
    $(document).keydown(function (event) {
        if (event.keyCode == 13) {
            $("#btnSubmit").click();
        }
    })
})
function AjaxPostData(url, data, callback) {
    $.ajax({
        type: "post",
        url: url,
        data: JSON.stringify(data),
        dataType: "json",
        contentType: "application/json",
        success: function (data, status) {
            console.log(data);
            if (status == 401 || status == 403) {
                window.location.href = "login.html";
                return;
            }
            callback(data);
        },
        error: function (err) {
            if (err.status == 401 || err.status == 403) {
                window.location.href = "login.html";
                return;
            }
            console.log(err);
        }
    });
}

 

4.2、请求接口

function AjaxCheckIsLogin() {
    url = commonData.rqDomain + "api/login/checkislogin";
    $.ajax({
        type: "get",
        url: url,
        beforeSend: function (xhr) {
            try {
                var u = commonData.currentUser();
                if (!u || !u.Token) {
                    window.location.href = "login.html";
                    return;
                }
                xhr.setRequestHeader("Authorization", "BasicAuth " + u.Token);
            } catch (e) {
                window.location.href = "login.html";
            }
        },
        xhrFields: { withCredentials: true },
        crossDomain: true,
        contentType: "application/json",
        success: function (data) {
            if (!data || !data.Ok)
                window.location.href = "login.html";
        },
        error: function (err) {
            if (err.status == 401 || err.status == 403) {
                window.location.href = "login.html";
                return;
            }
            console.log(err);
        }
    });
}

 

var commonData = {
    rqDomain: 'http://localhost:5003/',
    echartTheme: [{ dark: "theme-dark", backgroundColor: "#242640" }],
    currentUser: function () {
        try {
            var uStr = $.cookie(commonData.cookieName);
            if (uStr) {
                return JSON.parse(uStr);
            }
        } catch (e) {

        }
        return { CurrentAdmDivCode:""};
    },
    cookieName:'gwhbduserinfo'
};

 

posted @ 2019-02-16 16:18  wjl910  阅读(120)  评论(0)    收藏  举报