我正在构建一个 ASP.Net MVC 应用程序,它可以在 Web 和 JQuery 移动设备上运行。所以我正在为 Web 和 JQuery 移动应用程序创建一个单独的视图。我已将所有主要业务逻辑服务放置为 Web Api 调用,两个客户端都使用 AngularJs 调用这些服务,到目前为止,该服务运行良好。
现在我希望将安全性引入到应用程序中,并意识到基本身份验证是最快的入门方法,当我环顾四周时,我发现了非常好的帖子,可以帮助我以最小的努力构建相同的内容。以下是我主要使用的 3 个链接:
对于客户端
在服务器端:
到目前为止一切顺利,我所有的 WebApi 调用都按预期工作,
但是当我必须调用 MVC 控制器时,问题就开始了,
如果我尝试
[Authorize]
方法/控制器,它会在 MVC 上再次抛出表单身份验证视图,即使 API 已经设置了身份验证标头。
所以我有两个问题:
我们可以让WebApi和MVC在标头中共享相同的数据吗?在 AngularJS 中,我可以进行 MVC 控制器调用,该调用可以通过在 $http 中设置的授权块传递相同的标头信息,并在服务器端对其进行解码以生成我自己的身份验证并设置自定义。
如果上述情况不可能,我尝试调用 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
问候 基兰
[Authorize]
属性使用表单身份验证,但是很容易创建您自己的
BasicAuthenticationAttribute
,如您的第三个链接所示。
然后将
[BasicAuthentication]
放在 MVC 控制器上,而不是 [Authorize]
。