Asp.net mvc 4 ASP.NETMVC+;Web Api+;安格拉斯

Asp.net mvc 4 ASP.NETMVC+;Web Api+;安格拉斯,asp.net-mvc-4,angularjs,asp.net-web-api,Asp.net Mvc 4,Angularjs,Asp.net Web Api,我正在构建一个ASP.NETMVC应用程序,它可以在Web和jQueryMobile中工作。因此,我正在为Web和JQuery移动应用程序创建一个单独的视图。我将所有主要的业务逻辑服务都作为Web Api调用,由两个客户端使用AngularJs调用,到目前为止,AngularJs运行良好 现在我想在应用程序中引入安全性,并意识到基本身份验证是最快的方法,当我环顾四周时,我发现非常好的帖子帮助我以最小的努力构建了相同的功能。以下是我主要使用的3个链接: 对于客户端 :查找401错误并打开登录页面的

我正在构建一个ASP.NETMVC应用程序,它可以在Web和jQueryMobile中工作。因此,我正在为Web和JQuery移动应用程序创建一个单独的视图。我将所有主要的业务逻辑服务都作为Web Api调用,由两个客户端使用AngularJs调用,到目前为止,AngularJs运行良好

现在我想在应用程序中引入安全性,并意识到基本身份验证是最快的方法,当我环顾四周时,我发现非常好的帖子帮助我以最小的努力构建了相同的功能。以下是我主要使用的3个链接:

对于客户端

  • :查找401错误并打开登录页面的好方法,然后从您遗漏的地方继续
  • :这是确保我能够在后续请求中重用用户凭据所必需的。这是在$http中捕获的
  • 在服务器端:

  • 到目前为止,我所有的WebApi调用都正常工作

    但是当我必须调用MVC控制器时,问题就开始了

    如果我尝试
    [Authorize]
    方法/控制器,它会在MVC上再次抛出表单身份验证视图,即使API已经设置了身份验证头

    所以我有两个问题:

  • 我们能让WebApi和MVC在标题中共享相同的数据吗?在AngularJS中有一种方法,我可以进行MVC控制器调用,通过在$http中设置的授权块传递相同的头信息,并在服务器端对其进行解码以生成我自己的身份验证并设置自定义

  • 如果上述操作不可行,我尝试调用WebApi控制器重定向到一个适当的视图,然后使用一堆WebApi调用加载数据,这样用户就不会被再次要求输入详细信息

  • 我用以下属性“
    [ActionName(“MyWorkspace”)][HttpGet]
    ”修饰了它

    在我的菜单点击时,我调用了一个角度JS函数

    $scope.enterWorkspace = function(){
            $http.get('/api/execute/Registration/MyWorkspace?data=""')
              .then(
                    // success callback
                    function(response) {
                      console.log('redirect Route Received:', response);
                    },
                    // error callback
                    function(response) {
                       console.log('Error retrieving the Redirect path:',response);
                    }
               );
        }
    
    我在chrome开发者工具中看到,它被重定向,状态为200 OK,但视图没有刷新

    如果不可能共享WebApi和MVC身份验证,我们是否至少可以让这个重定向正常工作

    编辑

    遵循Kaido的建议,找到了另一个解释如何创建自定义CustomBasicAuthorizeAttribute的方法

    现在我可以在下面的主控制器上调用该方法:用“[HttpPost][CustomBasicAuthorize]”装饰

        public ActionResult MyWorkspace()
        {
            var redirectUrl = "/";
            if (System.Threading.Thread.CurrentPrincipal.IsInRole("shipper"))
            {
                redirectUrl = "/shipper/";
            }
            else if(System.Threading.Thread.CurrentPrincipal.IsInRole("transporter"))
            {
                redirectUrl = "/transporter/";
            }
    
            return RedirectToLocal(redirectUrl);
        }
    
    同样,它在一定程度上起作用,也就是说,当第一次调用时,它会进入我上面的重定向方法,但是当重定向调用返回时,它会再次丢失标题

    我能做些什么来确保重定向的呼叫也得到正确的报头设置吗

    顺便说一句,现在我的菜单点击如下所示:

    $scope.enterMyWorkspace = function(){
            $http.post('/Home/MyWorkspace')
              .then(
                    // success callback
                    function(response) {
                      console.log('redirect Route Received:', response);
                    },
                    // error callback
                    function(response) {
                       console.log('Error retrieving the Redirect path:',response);
                    }
               );
        }
    
    这最终归结为以下URL:
    http://127.0.0.1:81/Account/Login?ReturnUrl=%2fshipper%2f

    问候
    Kiran

    属性
    [Authorize]
    使用表单身份验证,但是创建自己的身份验证很容易

    BasicAuthenticationAttribute
    与第三个链接相同


    然后将
    [BasicAuthentication]
    放在MVC控制器上,而不是
    [Authorize]

    根据您的建议,我在我的原始帖子中对此进行了更新,但现在的问题是重定向回调再次缺少标题,有没有办法强制浏览器再次添加身份验证标头?
    $scope.enterMyWorkspace = function(){
            $http.post('/Home/MyWorkspace')
              .then(
                    // success callback
                    function(response) {
                      console.log('redirect Route Received:', response);
                    },
                    // error callback
                    function(response) {
                       console.log('Error retrieving the Redirect path:',response);
                    }
               );
        }