我仍然在ASP.NET中寻找我的路。
我正在尝试让Angular代码与Web API2端点对话,该端点只能从解决方案本身进行访问。
我希望能够做的一件事是根据当前用户是登录还是匿名浏览来显示或隐藏编辑按钮。
我想我可以做这样的事情
public class AuthorizationController : ApiController
{
public HttpResponseMessage Get()
{
if (User.Identity.IsAuthenticated)
{
return Request.CreateResponse(HttpStatusCode.OK, "Ok");
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "You are not authorized");
}
};
}然后这样叫它
$http.get("../api/authorization")
.then(function (response)
{
if(response.status=="200")
{
// logged in
}
else
{
// not logged in
}
});不幸的是,这并不是我所希望的。如果用户未登录,API代码将命中创建错误响应的行,但它实际返回到Angular回调的内容是
{"data":"<!DOCTYPE html>\r\n<html>\r\n<head>\r\n <meta charset=\"utf-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>Log in - My ASP.NET Application</title>\r\n <link href=\"/Content/bootstrap.css\" rel=\"stylesheet\"/>\r\n<link href=\"/Content/site.css\" rel=\"stylesheet\"/>\r\n\r\n <script src=\"/Scripts/modernizr-2.6.2.js\"></script>\r\n\r\n\r\n</head>\r\n<body>\r\n <div class=\"navbar navbar-inverse navbar-fixed-top\">\r\n <div class=\"container\">\r\n <div class=\"navbar-header\">\r\n <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\r\n <span class=\"icon-bar\"></span>\r\n <span class=\"icon-bar\"></span>\r\n <span class=\"icon-bar\"></span>\r\n </button>\r\n <a class=\"navbar-brand\" href=\"/\">Application name</a>\r\n </div>\r\n <div class=\"navbar-collapse collapse\">\r\n <ul class=\"nav navbar-nav\">\r\n <li><a href=\"/\">Home</a></li>\r\n <li><a href=\"/Home/About\">About</a></li>\r\n <li><a href=\"/Home/Contact\">Contact</a></li>\r\n </ul>\r\n <ul class=\"nav navbar-nav navbar-right\">\r\n <li><a href=\"/Account/Register\" id=\"registerLink\">Register</a></li>\r\n <li><a href=\"/Account/Login\" id=\"loginLink\">Log in</a></li>\r\n </ul>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"container body-content\">\r\n \r\n\r\n\r\n<h2>Log in.</h2>\r\n<div class=\"row\">\r\n <div class=\"col-md-8\">\r\n <section id=\"loginForm\">\r\n<form action=\"/Account/Login?ReturnUrl=%2Fapi%2Fauthorization\" class=\"form-horizontal\" method=\"post\" role=\"form\"><input name=\"__RequestVerificationToken\" type=\"hidden\" value=\"5h-wFJ5pn4Vq8uI15BbzTvAwAFuudI1jaF_YsHfpAp9YFaeArEkO4P6i5bFMYgSs6OY6BXDEHzNLFpxYA-IvQJlr7zYY8Bgj9mErF1dgMQQ1\" /> <h4>Use a local account to log in.</h4>\r\n <hr />\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\" for=\"Email\">Email</label>\r\n <div class=\"col-md-10\">\r\n <input class=\"form-control\" data-val=\"true\" data-val-email=\"The Email field is not a valid e-mail address.\" data-val-required=\"The Email field is required.\" id=\"Email\" name=\"Email\" type=\"text\" value=\"\" />\r\n <span class=\"field-validation-valid text-danger\" data-valmsg-for=\"Email\" data-valmsg-replace=\"true\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\" for=\"Password\">Password</label>\r\n <div class=\"col-md-10\">\r\n <input class=\"form-control\" data-val=\"true\" data-val-required=\"The Password field is required.\" id=\"Password\" name=\"Password\" type=\"password\" />\r\n <span class=\"field-validation-valid text-danger\" data-valmsg-for=\"Password\" data-valmsg-replace=\"true\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <div class=\"col-md-offset-2 col-md-10\">\r\n <div class=\"checkbox\">\r\n <input data-val=\"true\" data-val-required=\"The Remember me? field is required.\" id=\"RememberMe\" name=\"RememberMe\" type=\"checkbox\" value=\"true\" /><input name=\"RememberMe\" type=\"hidden\" value=\"false\" />\r\n <label for=\"RememberMe\">Remember me?</label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <div class=\"col-md-offset-2 col-md-10\">\r\n <input type=\"submit\" value=\"Log in\" class=\"btn btn-default\" />\r\n </div>\r\n </div>\r\n <p>\r\n <a href=\"/Account/Register\">Register as a new user</a>\r\n </p>\r\n</form> </section>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <section id=\"socialLoginForm\">\r\n \r\n<h4>Use another service to log in.</h4>\r\n<hr />\r\n <div>\r\n <p>\r\n There are no external authentication services configured. See <a href=\"http://go.microsoft.com/fwlink/?LinkId=403804\">this article</a>\r\n for details on setting up this ASP.NET application to support logging in via external services.\r\n </p>\r\n </div>\r\n\r\n\r\n </section>\r\n </div>\r\n</div>\r\n\r\n\r\n <hr />\r\n <footer>\r\n <p>© 2016 - My ASP.NET Application</p>\r\n </footer>\r\n </div>\r\n\r\n <script src=\"/Scripts/jquery-2.2.3.js\"></script>\r\n\r\n <script src=\"/Scripts/bootstrap.js\"></script>\r\n<script src=\"/Scripts/respond.js\"></script>\r\n\r\n \r\n <script src=\"/Scripts/jquery.validate.js\"></script>\r\n<script src=\"/Scripts/jquery.validate.unobtrusive.js\"></script>\r\n\r\n\r\n\r\n<!-- Visual Studio Browser Link -->\r\n<script type=\"application/json\" id=\"__browserLink_initializationData\">\r\n {\"appName\":\"Firefox\",\"requestId\":\"69b5785bb7f0400088c465aa19c19c8a\"}\r\n</script>\r\n<script type=\"text/javascript\" src=\"http://localhost:55784/9f4b9571f5a149d8a3ad956c641aff65/browserLink\" async=\"async\"></script>\r\n<!-- End Browser Link -->\r\n\r\n</body>\r\n</html>\r\n","status":200,"config":{"method":"GET","transformRequest":[null],"transformResponse":[null],"url":"../api/authorization","headers":{"Accept":"application/json, text/plain, */*"}},"statusText":"OK"} 所以它看起来是在返回一个登录页面。谁能告诉我我哪里做错了?或者我用这种方法完全找错了对象?
发布于 2016-06-01 06:21:22
假设您使用的是表单身份验证。默认情况下,forms身份验证将在管道中检测到未经身份验证的事件(401),并将其转换为到登录页面的重定向(302)。如果您客户端自动遵循该重定向(大多数都是这样做),那么您最终将获得带有HTTP成功状态代码(200)的登录页面内容。
对此有两种相当简单的解决方案:
HttpResponse.SuppressFormsAuthenticationRedirect属性设置为true。每个HttpResponse.SuppressFormsAuthenticationRedirect的文档
默认情况下,窗体身份验证将HTTP401状态代码转换为302,以便重定向到登录页。这不适合某些类型的错误,比如身份验证成功但授权失败时,或者当前请求是AJAX或web服务请求时。此属性提供了一种取消重定向行为并将原始状态代码发送到客户端的方法。
关于财产的价值:
如果应禁止窗体身份验证重定向,则为
true;否则为false。
要进一步阅读,并将Phil Haack作为我关于这个主题的第一个简单信息来源,请查看他关于这个主题的blog post。
发布于 2018-10-10 15:58:01
我知道问题是关于服务器端web api的。
但如果有人想研究另一种方法,
并且可以在客户端使用javascript/typescript完成此操作
也许这种方法可以帮助未来的读者:
我更喜欢在本地使用localStorage并将不必要的调用保存到服务器上。
this.serverResponse.expires_in是过期时间,单位为秒。
从web api服务器提取到期日期:
var tokenexpiration: Date = new Date();
tokenexpiration.setSeconds(new Date().getSeconds() + parseInt(this.serverResponse.expires_in))
console.log(tokenexpiration);然后您可以将其保存到localStorage:
localStorage.setItem('expirationdate',tokenexpiration)使用简单的条件,您可以随时检查令牌是否已过期。
发布于 2016-06-01 05:04:21
你应该看看AuthorizeAttribute。你可以用它或者它的一些方法来装饰你的控制器,然后在AngularJS中处理UnAuthorized异常(我想是401状态)。
大多数情况下,.Net将根据cookies来决定请求是否经过授权,但这实际上取决于您使用的身份验证方案。
https://stackoverflow.com/questions/37555431
复制相似问题