精华内容
下载资源
问答
  • webapi 访问权限

    千次阅读 2018-06-05 15:44:36
    webapi不需要登陆,只需要知道方法就能直接访问,这个就比较郁闷了。因为之前也没有做过权限控制的问题,百度搜了不少,但是都能用,只能自己解决了,后来终于找到了一种可以实现的方法,只是知道好不好,希望...

           最近在做一个项目,前台使用的是angularjs,后台使用的是webapi。webapi不需要登陆,只需要知道方法就能直接访问,这个就比较郁闷了。因为之前也没有做过权限控制的问题,百度搜到了不少,但是都不能用,只能自己解决了,后来终于找到了一种可以实现的方法,只是不知道好不好,希望有人看到能给个答案。实现方法如下:

          1、根据登陆信息(用户名,密码之类的)去数据库查询到用户信息,以及用户所有的权限(权限由在增加用户的时候分配)。

          2、建立FormsAuthenticationTicket,并把用户信息保存到缓存中,并返回登陆结果及一个token(唯一标识),userRole是一个需要返回的信息实体类。

              FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                    2,
                    list[0].USERID,
                    DateTime.Now,
                    dateCookieExpires,
                     false,
                    new JavaScriptSerializer().Serialize(userRole)-------权限(后面用到)
                    );
                string encTicket = FormsAuthentication.Encrypt(ticket);
        HttpRuntime.Cache.Add(userRole.TOKEN, encTicket, null, DateTime.Now.AddDays(7), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Default, null);------------保存到缓存中,也可以存到数据库

                return Json(userRole);

        

          3、把token保存到本地       localStorage.setItem("token",userRole.TOKEN);

          4、创建一个全局注入器,每次访问的时候,可以自动在header中带入token

               

    .factory("httpInjector",['$q','$injector',function($q,$injector){
        var httpInterceptor = {
            'responseError' : function(response) {
                // ......
                return $q.reject(response);
            },
            'response' : function(response) {
                if (response.status == 21000) {
                    // console.log('do something...');
                }
                return response || $q.when(response);
            },
            'request' : function(config) {
                config.headers = config.headers || {};
                if (localStorage.token) {
                    config.headers.token = localStorage.getItem("token");
                    // config.headers['X-Access-Token'] = $localStorage.token;
                };
    
                return config || $q.when(config);
    
                return config;
            },
            'requestError' : function(config){
                // ......
                return $q.reject(config);
            }
        };
        return httpInterceptor;
    

    }])

    5、把注入器配置到config中

    .config(["$ionicConfigProvider",'$httpProvider', function ($ionicConfigProvider,$httpProvider) {
        $httpProvider.interceptors.push('httpInjector');
    }])
    
    

     6、创建一个过滤器TestFilter,继承AuthorizationFilterAttribute,重写方法

             public override void OnAuthorization(HttpActionContext actionContext)-------重写授权方法        {    

            if (HttpContext.Current.Request.Headers["token"] != null)        

        {         

           string token = HttpContext.Current.Request.Headers["token"].ToString();---------获取前台传过来的token                      if (HttpRuntime.Cache.Get(token) != null)

                    {

                      ------------根据token到缓存中取出用户信息。

                  FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(HttpRuntime.Cache.Get(token).ToString());

                        if (ticket != null)                 

             {                   

         USER_ROLE userRole = new JavaScriptSerializer().Deserialize<USER_ROLE>(ticket.UserData);           

                 string[] roles = new string[] { };--------取出用户权限组成数据                

            IIdentity identity = new FormsIdentity(ticket);-------------标识用户的身份验证的类型              

              IPrincipal principal = new GenericPrincipal(identity, roles); ---------当前用户标识                        HttpContext.Current.User = principal;-----------  为当前 HTTP 请求设置安全信息。                    

                        }           

                    }       

                 }

            }

         7、把自定义的过滤器注册到webapiconfig中,注册后每次webapi请求会先经过过滤器

                 config.Filters.Add(new TestFilter());

    8、方法或控制器上添加权限限制   [Authorize(Roles = "TEST")]

    到此完成,没有此权限的用户就无法访问此方法。

    为什么要返回token到前台,然后把用户信息保存到缓存中呢?是因为对于webapi来说,每次的访问都是一个新的请求,

    之前的登陆信息在下次访问的时候就请求不到了,cookie和session也访问不到,所以信息保存到了缓存中(保存到数据库也可以

    但是请求太频繁)。根据token,找到对应的用户信息,取出用户信息后赋给当前请求用户,当前用户才有访问权限。

       

    展开全文
  • WEB API action请求不到的原因

    千次阅读 2018-10-18 17:20:37
    WEB API请求的过程是: URL =&gt;&gt; 匹配路由模板 =&gt;&gt; 匹配 controller =&gt;&gt; 匹配 action WEB API与MVC不同的是,WEB API是通过请求的方式来匹配action,默认从action的方法...

    WEB API请求的过程是:

    URL =>> 匹配路由模板 =>> 匹配 controller =>> 匹配 action

    WEB API与MVC不同的是,WEB API是通过请求的方式来匹配action,默认从action的方法名中获取,就是说,如果action以GET开头,那么匹配的时候,就把他看作get的action。但是,如果action没有以请求开头,那么还可以通过在action前添加标记的方式,显示的声明action的请求方式,如 [Http Get],[Http Post],如果既没有以请求方式开头命名action,也不添加标记声明,那么会返回405——方法不被允许的错误。

    因此,建议在每个action前加上请求方式的标记。

    展开全文
  • 2.POST取不到参数原因和解决方案: 解决方案完整代码 吐血原创,转载请注明出处! 1.WebApi 404原因和解决方案 关于404,第一个可能出现该问题的原因就是,这个APIController类没有public声明 第二个,如果route...

    目录

    1.WebApi 404原因和解决方案

    2.POST取不到参数原因和解决方案:

     解决方案完整代码


    吐血原创,转载请注明出处!

    1.WebApi 404原因和解决方案

    关于404,第一个可能出现该问题的原因就是,这个APIController类没有public声明

    第二个,如果routeTemplate: "api/{controller}/{action}/{id}",那么你的请求地址应该是

    http://localhost:9000/api/log/Get

    这里的{action},指的是同一个ApiController可以有多个Get Post方法.

    第三个,如果你使用的是别的网络来访问这个接口,那么localhost应该改成本机的IP,获取本机IP的代码如下:

    //获取本机IP
    string IP = "";
    IPHostEntry here = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress _ip in here.AddressList) {
        if (_ip.AddressFamily.ToString().ToUpper() == "INTERNETWORK") {
            IP  = _ip.ToString();
            break;
        }
    }
    
    //本地Http服务器
    string baseAddress = "http://"+ IP  +":9000";
    disposeable = WebApp.Start<Startup>(url: baseAddress);
    

    第四个404的可能原因就是,你Get或Post请求,参数未上传或者上传方式错误也会导致404,未上传导致的404这个问题略过,关于服务器为何收不到参数导致404请继续往下看. 


    2.POST取不到参数原因和解决方案:

    如上图中的代码,Get方法中是可以直接取msg参数值的,但是Post死活取不到,不管参数前加了[FromBody]还是[FromUri]又或者声明[HttpPost]都取不到,见鬼了,后来在某个群里问起这个问题,有个仁兄说他都是建模取的,然后我就瞎猫碰死耗子,建了个对象来套,就跟Dao层使用一个对象来接收参数一样,如下图

    测试:

    Post方法中我返回的是字符串,并且MediaTypeHeaderValue也设置了"text/html",为何这里返回的字符串会带有双引号?

    解决方案,将return ""改成如下


     解决方案完整代码

    吐血原创,转载请注明出处!

    展开全文
  • 今天总结一种最简单的方式,来保障webapi不被别人随便调用。这里总结下identityserver4的使用。 IdentityServer4 是最新也是比较容易上手的一个开源框架,你要是从IdentityServer3开始用,会很容易头大,搞清楚...

         webapi项目通常需要考虑跨域,安全性等问题。今天总结一种最简单的方式,来保障webapi不被别人随便调用。这里总结下identityserver4的使用。

    IdentityServer4 是最新也是比较容易上手的一个开源框架,你要是从IdentityServer3开始用,会很容易头大,搞不清楚所以然。就github上面的使用例

    子看,IdentityServer4是比较容易理解上手的。这次我们使用了类似openId connect的方式。客户端访问apiServer的时候,先去IdentityServer上面请求

    一个访问token。使用这个token,访问ApiServer的各个接口。


    如上图: IdentityServer4 需要增加IdentityServer4 框架的引用,同时webapiserver,需要增加IdentityServer4 .AccessTokenValidation的引用,客户端可以通过多种方式,请求。可以参考git上面的sample。我这里使用的控制台程序测试用,Client 引入identityModel  的引用。

    下面搭建框架:

    1 首先是identityserver4 ,主要是从demo里改写配置即可。基本不需要增加代码。

    在Startup.cs 中 配置IdentityServer4

            public void ConfigureServices(IServiceCollection services)
            {
                services.AddDeveloperIdentityServer()
                    .AddInMemoryScopes(Config.GetScopes())
                    .AddInMemoryClients(Config.GetClients());
            }
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                app.UseIdentityServer();
            }
    在Config中配置可用的client,注意AllowdGrantTypes 是ClientCredentials类型的。

            public static IEnumerable<Client> GetClients()
            {
                List<Client> lst = new List<Client>();
                var client = new Client()
                {
                    ClientId = setting.ClientID,
                    AllowedGrantTypes = GrantTypes.ClientCredentials,
    
    
                    ClientSecrets =
                        {
                            new Secret(setting.SercetKey.Sha256())
                        },
                    AccessTokenLifetime = setting.TokenLiftTime * 3600, //AccessToken的过期时间, in seconds 
                    AllowedScopes = { setting.APPName }
                };
                lst.Add(client);
                return lst;
               
            }

    2 webapi 服务配置

    由于新的identityserver4都是可以基于.net core平台的,发布在iis上使用useIISintegration属性代替useUrls。

            public static void Main(string[] args)
            {
                var host = new WebHostBuilder()
                    .UseKestrel()
                    .UseIISIntegration()  //.UseUrls("http://localhost:5001") 
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .UseStartup<Startup>()
                    .Build();
    
                host.Run();
            }

    然后在Startup.cs 中 配置需要绑定的授权服务器的ip。即修改 Authority属性,指定apiName,这些信息都是会被写到token的签名里,所以一个字符

    都不能错。否则,n多的401错误。unauthroity

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                loggerFactory.AddConsole(Configuration.GetSection("Logging"));
                loggerFactory.AddDebug();
                  app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
                {
                    Authority = Configuration["Server"],
                    RequireHttpsMetadata = false,
                   // BackChannelTimeouts = t
                    ApiName = "TempSenGoApi"
                });
    
    
                app.UseCors("any");
    
                app.UseMvc();
            }

    下面我们来定义API,添加一个Web API 控制器 ClientController  使用 【Authorize】注释来标记类。则token的验证全部由框架完成。如果token验证通过,则进入get action的代码中,进行业务逻辑的处理,如果验证非法。则不会进入get的代码里。

    [Route( " api/[controller] " )]
        [Authorize]
        public class ClientController : Controller
        {
            [HttpGet]
            public IActionResult Get()
            {
                return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
            }
        }
    3.请求token

    客户端代码如下:

    public static void Main( string [] args)
            {
                //访问授权服务器获取token
                var disco = DiscoveryClient.GetAsync("http://localhost:5000").Result;
                var tokenClient = new TokenClient(disco.TokenEndpoint, "linezeroclient", "secret");
                var tokenResponse = tokenClient.RequestClientCredentialsAsync("zeroapi").Result;
                
                //设置token 访问API tokenResponse.AccessToken 就是请求到的token,可以使用这个token访问webapi
                var client = new HttpClient();
                client.SetBearerToken(tokenResponse.AccessToken);
    
                var response = client.GetAsync("http://localhost:5001/api/Identity").Result;
                if (!response.IsSuccessStatusCode)
                {
                    Console.WriteLine(response.StatusCode);
                }
                var content = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine(content);
                Console.ReadKey();
            }
    4 使用postman测试该token。


    总结: 我理解的处理流程是这样的。token存储在identityserver4服务器上而不是临时存储,比如内存中,就算服务器重新启动,token依旧有效。只依赖于token本身的内容,时候过期。当应用client请求到了token以后,在head中加入token。请求发送给webapi,webapi中的AccessTokenValidation 会将token实时发送给identityserver4,去验证。验证通过后,进入action的处理函数中。也就是说无论webapi重新启动,还是identityserver4重新启动,都不会使token过期。

    做完才发现个不错的帖子。也可以参考。

    展开全文
  • 新建了个.NetCore 5.0 的 WebAPI项目,发布部署到WINDOWS10 的 IIS后,默认打开 http://127.0.0.1/swagger 出现404找不到页面的错误。 原因: 因为.NetCore 5.0 自带集成了Swagger , 在发布项目时,通常会在代码中...
  • .NET (C#)下简单的WebAPI构建、访问控制、发布、本地访问0.前言1.WebAPI2.WebAPI和MVC的区别3.如何创建一个简单WebAPI4.发布网站(WebAPI)5.本地IIS访问6.后记 0.前言 问题来源是实际使用中遇到的问题,公司希望...
  • Web API

    千次阅读 2014-12-01 22:30:04
    ASP.NET Web API 简介 ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器、移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RESTful 服务的理想平台。 ASP...
  • 学习WebApi时间较短,在一个项目中需要向WebApi发送数据,但是使用C#调用WebApi(Post)时总返回400错误,找了很久,总以为是调用方法有问题,后来发现其实是WebApi中,Post方法参数的问题。下面是测试代码: 实体:...
  • 创建WebAPI:通过WebAPI提供接口

    千次阅读 2019-01-24 11:29:54
    昨天和第三方厂家调试,我提供的WebService服务对方通过PostMan工具死活调不通(PS:这里PostMan可以调Webservice服务,不过...这一步这里如果只需要提供方法给别人调用的话,需要选WebAPI,选个空就可以了,...
  • 最近在写个webapi 的接口服务,正常后端请求没什么问题。 但想对方可以直接用ajax 进行调用,那么接口就得支持跨域访问才行。 网上找了一下,发现通常有两种方式。 1.在webapi路由里面配置,EnableCorsAttribute ...
  • ASP.NET WEB API站点访问报404错误

    千次阅读 2019-04-25 09:15:52
    最近处理一个项目发现一个问题,基于.net 4.5的 WEB API站点访问时始终报404错误,环境是window server 2008 R2 + iis7, 同样的版本代码在很多别的项目没有出现过问题。 后来通过stackoverflow找到解决办法 在站点...
  • 安卓访问webAPI,并取回数据

    千次阅读 2018-07-27 10:33:32
    安卓访问webAPI,并取回数据 前言  安卓自从4.0以后,所有的网络访问都需要异步进程操作。其自带的异步类有AsyncTask,Handler,以及可以声明Thread等等。涉及多进程,必须要提到一个问题,线程与线程之间能...
  • IIS 网站搭建及WebApi局域网访问配置

    千次阅读 2019-08-16 09:40:27
    5.解决VS搭建的WebAPI只能用localhost,能用ip的问题 没有解决前 6.解决步骤 (1)用管理员身份启动VS,然后再打开项目。 (2)运行项目。 运行后,电脑右下方出现如下图标 出现下列图向后,点击自己要修改的...
  • Postman访问Webapi的Get/Post/Put/Delte请求

    千次阅读 2018-07-26 15:04:46
    ASP.NET MVC WebApi 定义Get/Post/Put/Delete方法。使用Postman工具调用相应的方法。根据方法的特性不同、参数的特性不同,所访问的方式也不同。 问题分析: 创建一个新的WebApi的项目。控制器自动生成的代码如下...
  • WebAPI学习(一)——创建Web API程序

    万次阅读 热门讨论 2016-03-13 14:59:50
    在公司中用的都是webAPI的应用程序,这个东西之前没有接触过。但是这个并是什么新鲜的东西,因我们 之前有mvc的基础,所以说学习这个东西还是比较容易的,在开始的时候自己可能突然蒙圈了。因为在人家项目中用 ...
  • c# 进阶之 WebAPI

    千次阅读 2018-04-24 15:07:35
    c# 进阶之 WebAPIREST是...而webapi是Json的数据传递webapi的优点有哪些?(1)非常适合做http的请求,前端与webapi交互特别方便(2)webapi更轻量因为使用的json数据来传递。(3)webapi很多时候是给前端提供数据的,因...
  • 使用System.Web.Http.Cors... 在webapi中使用System.Web.Http.Cors配置跨域信息可以有两种方式,一种是在App_Start.WebApiConfig.cs的Register中配置如下代码,这种方式将在所有的webapi Controller里面起作用。using
  • 不到与请求 URI“http://localhost:54176/api/Products”匹配的 HTTP 资源。", "messageDetail": "未找到与名为“ManHourPrices”的控制器匹配的类型。"}控制器部分:[RoutePre...
  • C/S系统也可以和B/S系统一样实现“前后端分离”,那这样写winform就相当于纯粹的前端页面了,然后再单独部署一个webapi项目,通过api调用数据库进行数据的操作,有利于维护和数据安全性的提高,那么winform怎么去...
  • 调用webapi接口的实现

    千次阅读 2019-11-06 19:35:44
    远程调用webapi接口技术文档 一、webapi接口 Webapi接口是一种使用json作为存放服务端数据的载体,将服务端数据生成为json,以json的形式存放,供外界调用,获取数据。外界用户需要获取数据时,向webapi接口发起...
  • 随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细。比如前端项目使用Angularjs的框架来做UI,而数据则由另...这样问题就来了,如果前端通过ajax访问Web Api项目话,就涉及跨域了。我们知道
  • WebAPI隐藏默认首页

    千次阅读 2019-04-03 17:56:08
    某项目需要通过WebAPI提供GIS接口服务。开发完成,部署客户机后,客户又提出,希望人们能够通过IP+端口号的方式直接访问到接口服务网站,以免直接在接口页面进行测试或操作,导致数据安全方面的问题。 比如,...
  • docker 部署 webapi 示例

    千次阅读 2018-10-31 20:50:13
    利用docker的容器化平台来部署一个.net core webapi项目 第一步:创建的WebAPI项目 可以通过vs创建项目也可以通过dotnet new webapi来创建,示例使用的是命令行创建的,目录如下: 第二步:编译通过 手动生成...
  • 我们做项目的时候可能会遇到需要提供api给app调用,ABP动态生成的WebApi提供了方便的基于JWT标准的Token访问方式供我们访问API,不用在代码上做任何改动,很方便有木有! 一.什么是JWT Json web token (JWT), 是...
  • 初尝Web API

    万次阅读 2012-11-10 22:05:50
    HTTP 并是只能用在网页中。它其实还是一个强大的平台,可以用来生成一些API,暴露服务和数据。...ASP.NET Web API 是.NET Framework上的一个框架,用来生成 web API。 本文将使用ASP.NET Web API
  • WebAPI接口调试技巧

    万次阅读 2017-09-05 17:01:45
    1.了解WebAPI接口 接口模式:基于MVC4.0的WebAPI 承载协议:HTTP 跟踪工具:IE11 请求方式:POST 请求URL:IP:Port/Application/Controller/ActionName/Parameters 请求参数:一串由JSON对象转化而成的字符串 响应...
  • Web Api 的 路由机制

    千次阅读 2017-05-11 13:37:34
    ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务。 ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。所以我们要想学习web api ...
  • Web Api 在本地开发环境中访问:http://localhost:65434/api/xxx 正常,但是部署IIS上确访问不了。 查询原因,需要在Web.config中配置:
  • 具体的问题就是我在一个现有的项目上创建了一个Web API Controller Class,但是按F5启动调试后,通过给定的路径如“http://localhost:3753/api/values/5”访问Get(int id)方法时,没有反应,设置了断点也进去。...
  • ASP.NET WebApi技术从入门实战演练

    千次阅读 2018-04-23 09:59:52
    一、课程介绍 曾经有一位不知名的讲师说过这么一句名言: 一门RPC技术不会,那么千万万门RPC技术将都不会!在今天移动互联网的时代,作为攻城师的... 希望大家学完本次分享课程能够达到使用ASP.NET WebAPI技术,并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 408,494
精华内容 163,397
关键字:

webapi访问不到