ASP.Net MVC + Web Api + AngularJs 中的页面重定向

问题描述 投票:0回答:1

我正在构建一个 ASP.Net MVC 应用程序,它可以在 Web 和 JQuery 移动设备上运行。所以我正在为 Web 和 JQuery 移动应用程序创建一个单独的视图。我已将所有主要业务逻辑服务放置为 Web Api 调用,两个客户端都使用 AngularJs 调用这些服务,到目前为止,该服务运行良好。

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

对于客户端

  1. HTTP 身份验证拦截器模块:一种查找 401 错误并打开登录页面的好方法,然后从您离开的地方继续。
  2. 在 AngularJS 中实现 HTTP 请求的基本 HTTP 身份验证:这是确保我能够在后续请求中重用用户凭据所必需的。这是在 $http 中捕获的。

服务器端

  1. 使用 Asp.Net WebAPI 进行基本身份验证

到目前为止一切顺利,我所有的 WebApi 调用都按预期工作,

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

如果我尝试

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

所以我有两个问题:

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

  2. 如果上述情况不可能,我尝试调用 WebApi 控制器以重定向到正确的视图,然后使用一堆 WebApi 调用加载数据,这样用户就不会被要求再次输入详细信息。

我用以下属性“

[ActionName("MyWorkspace")] [HttpGet]
”来装饰它

    public HttpResponseMessage GotoMyWorkspace(string data)
    {
        var redirectUrl = "/";
        if (System.Threading.Thread.CurrentPrincipal.IsInRole("shipper"))
        {
            redirectUrl = "/shipper";
        }
        else if (System.Threading.Thread.CurrentPrincipal.IsInRole("transporter"))
        {
            redirectUrl = "/transporter";
        }
        var response = Request.CreateResponse(HttpStatusCode.MovedPermanently);
        string fullyQualifiedUrl = redirectUrl;
        response.Headers.Location = new Uri(fullyQualifiedUrl, UriKind.Relative);
        return response;
    }

在我的菜单上单击我调用一个 Angular 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。

现在我可以调用下面的 Home 控制器上的方法:用“[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);
                }
           );
    }

最终确定为以下网址:

http://127.0.0.1:81/Account/Login?ReturnUrl=%2fshipper%2f

问候 基兰

asp.net-mvc-4 angularjs asp.net-web-api
1个回答
0
投票

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

BasicAuthenticationAttribute
,如您的第三个链接所示。

然后将

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

© www.soinside.com 2019 - 2024. All rights reserved.