消费从MVC授权WebAPI 2

伍特·范·兰斯特

我在同一个ASP.NET项目中有一个ApiController和一个Controller。我的想法是,我想向第三方公开REST API,并在我公开的REST API之上构建网站。

我想从我的MVC控制器(在ProfileController中)使用REST API(在ProfileApiController中)。这两个控制器都需要进行身份验证,并且ProfileApiController的响应取决于活动的User.Identity。

我该如何实现?

代码如下:

namespace Controllers
{
    [Authorize]
    public class ProfileApiController : ApiController
    {

        [Route("api/profile/{param}")]
        [HttpGet]
        public async Task<IHttpActionResult> GetProfile(string param)
        {
            return this.Ok<IEnumerable<TransferObject>>( /* business logic */ );
        }
    }


    [Authorize]
    public class ProfileController : Controller
    {
        public async Task<ActionResult> GetProfile()
        {
            //Pseudocode -- this is what I'm looking for
            var api = (reference_to_profileapicontroller);
            api.Authenticate(User.Identity);
            var m = api.GetProfile("myparameter");
            //End Pseudocode

            return View(m):
        }
    }

}

我已经尝试了两种方法:

  • 通过HttpClient调用WebApi

        HttpClientHandler h = new HttpClientHandler();
        var client = new HttpClient(h);
        var response = client.GetAsync("http://localhost:4827/api/profile/param/").Result;
        var m = await response.Content.ReadAsAsync<List<TransferObject>>();
        return View(m);
    

但是在这里,我坚持将身份从Controller传递到ApiController

  • 直接调用控制器

        var pc = DependencyResolver.Current.GetService<ProfileController>();
        var r = await pc.GetTenseProfile("param");
        var rr = await r.ExecuteAsync(System.Threading.CancellationToken.None);
        var m = await rr.Content.ReadAsAsync<List<TransferObject>>();
        return View(m);
    

但这变成一团糟,因为需要配置pc.Configuration和pc.Request。这不应该很难吗?

阿什利·李(Ashley Lee)

我会按此顺序走3条路线中的一条。

  1. Controller通用的逻辑ApiController移到一个类中,然后在控制器中使用该类。

    [Authorize]
    public class ProfileApiController : ApiController
    {
        [Route("api/profile/{param}")]
        [HttpGet]
        public async Task<IHttpActionResult> GetProfile(string param)
        {
            // have all business logic in this class
            ProfileClass = newClass = new ProfileClass();
            IList<TransferObject> vm = newClass.GetData();  // from bus rules
    
            return this.Ok<IList<TransferObject>>(vm);
        }
    }
    
    [Authorize]
    public class ProfileController : Controller
    {
        public async Task<ActionResult> GetProfile()
        {
            // have all business logic in this class
            ProfileClass = newClass = new ProfileClass();
            IList<TransferObject> vm = newClass.GetData();  // from bus rules
    
            return View(vm):
        }
    }
    
  2. 通过AJAX使用您的API。这是更多的服务器往返,但是使用了您设计的API。使用视图中的参数对API控制器进行AJAX调用。

    [Authorize]
    public class ProfileController : Controller
    {
        public async Task<ActionResult> GetProfile()
        {
            return View("myparameter"):
        }
    }
    
  3. 使用基于声明的身份验证,其中包括请求中的标头。如果您要保护自己的API,那么您可能已经在这样做了。使用上面列出的HttpClient,然后仅根据MVC中的用户在标题中添加承载令牌。

    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = 
        new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
    

    这也可能会有所帮助:http : //www.asp.net/web-api/overview/security/individual-accounts-in-web-api

选项2和3中有很多冗余代码。对于您的控制器来说,最好不要使用业务逻辑,而让您的代码使用它。我认为在每个Action的MVC代码中的各处都必须创建HttpRequest并不是一个好习惯。当您必须重构时,这将导致很多麻烦。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

消费从MVC授权WebAPI 2

来自分类Dev

无法理解MVC5 + WebApi2授权

来自分类Dev

ASP.NET MVC5 WebAPI2防止未经授权的重定向到登录页面

来自分类Dev

.Net Core WebApi OAuth2授权类型

来自分类Dev

未经授权或用户登录即可保护Webapi 2

来自分类Dev

.Net MVC WebApi 和 Angular2

来自分类Dev

Linq2Twitter MVC授权返回空值

来自分类Dev

Linq2Twitter MVC授权返回空值

来自分类Dev

WebAPI 授权

来自分类Dev

使用OWIN OAuth的MVC 5和WebApi2

来自分类Dev

WebApi 2和MVC 5用户的路由属性是否不同?

来自分类Dev

使用OWIN的Ninject for MVC5,WebApi2

来自分类Dev

使用承载令牌的MVC 5 Identity 2和Web API 2授权和调用api

来自分类Dev

消费XML WebApi

来自分类Dev

输出缓存过期会导致WebApi请求(MVC5 / webapi2)突然增加

来自分类Dev

ASP.NET MVC + Web API2 + AngularJS授权和身份验证

来自分类Dev

DreamFactory 2授权错误

来自分类Dev

Xero oAuth 2授权

来自分类Dev

使用AngularJS,WebAPI 2和Oauth 2时,如何将授权信息发送回我的客户端应用程序?

来自分类Dev

使用AngularJS,WebAPI 2和Oauth 2时,如何将授权信息发送回我的客户端应用程序?

来自分类Dev

WebApi中的授权

来自分类Dev

asp.net mvc5 webapi2,如何通过剃刀语法获取我的webapi网址?

来自分类Dev

MVC5,WebAPI2和Ninject无参数构造函数错误

来自分类Dev

如何使用StructureMap,MVC 5和WebApi 2注册每个请求的依存关系?

来自分类Dev

如何使StructureMap与AngularJs / MVC5和WebApi2 Web项目一起使用

来自分类Dev

在MVC应用程序中通过DataTables.NET Ajax调用访问WebAPI 2 json

来自分类Dev

WebApi 2身份验证和ASP.NET MVC 5应用程序

来自分类Dev

Windows Store应用程序中的MVC5 WebApi2(OWIN)和WebAuthenticationBroker

来自分类Dev

MVC5应用程序未按我的WebAPI2 POST方法创建新记录

Related 相关文章

  1. 1

    消费从MVC授权WebAPI 2

  2. 2

    无法理解MVC5 + WebApi2授权

  3. 3

    ASP.NET MVC5 WebAPI2防止未经授权的重定向到登录页面

  4. 4

    .Net Core WebApi OAuth2授权类型

  5. 5

    未经授权或用户登录即可保护Webapi 2

  6. 6

    .Net MVC WebApi 和 Angular2

  7. 7

    Linq2Twitter MVC授权返回空值

  8. 8

    Linq2Twitter MVC授权返回空值

  9. 9

    WebAPI 授权

  10. 10

    使用OWIN OAuth的MVC 5和WebApi2

  11. 11

    WebApi 2和MVC 5用户的路由属性是否不同?

  12. 12

    使用OWIN的Ninject for MVC5,WebApi2

  13. 13

    使用承载令牌的MVC 5 Identity 2和Web API 2授权和调用api

  14. 14

    消费XML WebApi

  15. 15

    输出缓存过期会导致WebApi请求(MVC5 / webapi2)突然增加

  16. 16

    ASP.NET MVC + Web API2 + AngularJS授权和身份验证

  17. 17

    DreamFactory 2授权错误

  18. 18

    Xero oAuth 2授权

  19. 19

    使用AngularJS,WebAPI 2和Oauth 2时,如何将授权信息发送回我的客户端应用程序?

  20. 20

    使用AngularJS,WebAPI 2和Oauth 2时,如何将授权信息发送回我的客户端应用程序?

  21. 21

    WebApi中的授权

  22. 22

    asp.net mvc5 webapi2,如何通过剃刀语法获取我的webapi网址?

  23. 23

    MVC5,WebAPI2和Ninject无参数构造函数错误

  24. 24

    如何使用StructureMap,MVC 5和WebApi 2注册每个请求的依存关系?

  25. 25

    如何使StructureMap与AngularJs / MVC5和WebApi2 Web项目一起使用

  26. 26

    在MVC应用程序中通过DataTables.NET Ajax调用访问WebAPI 2 json

  27. 27

    WebApi 2身份验证和ASP.NET MVC 5应用程序

  28. 28

    Windows Store应用程序中的MVC5 WebApi2(OWIN)和WebAuthenticationBroker

  29. 29

    MVC5应用程序未按我的WebAPI2 POST方法创建新记录

热门标签

归档