2016-05-31 8 views
0

私はまだASP.NETで自分のやり方を見つけています。Web Api 2 - ユーザーがログインしていることを確認

私は、角度コードをWeb API 2エンドポイントに話しかけることを実験しています。このエンドポイントは、ソリューション自体からのみアクセスされます。

私ができるようにしたいのは、現在のユーザーがログインしているか匿名でブラウジングしているかに基づいて編集ボタンを表示または非表示にすることです。

私はこれをMVCビューでUser.Identity.IsAuthenticatedにチェックすることでこれを行うことができましたが、純粋な角度のページでどのようにできるのか不思議です。

私はちょうどこの

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コードはエラー応答を作成する行を打つが、何それは実際に角度コールバックに戻りますが

{"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>&copy; 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"} 

あるので、それはページ内のログを返しているように見えます。誰かが私が間違っていることを教えてもらえますか?または、私はこのアプローチで間違ったツリーを完全に吠えるだけですか?

+0

私は問題を絞り込んだ。基本的には、APIコントローラからUnauthorized()を返すと、ステータス200のレスポンスとページのログインを表すデータに変換されているようです。この動作を防止し、実際にコントローラに401を返すようにする方法はありますか? – Toby

答えて

0

AuthorizeAttributeをご覧ください。あなたはコントローラをいくつかのメソッドで飾ることができ、次にAngularJS(状態401と思われます)のUnAuthorized例外を処理します。

.Netは、ほとんどの場合、Cookieに基づいてリクエストが許可されているかどうかを判断しますが、これは実際に使用している認証方式に依存します。

+0

これは私の最初のアプローチでした。私はAuthorize属性を使用しました。しかし、それはまた、401ページではなく、ログインページのHTMLを返します。リクエストやレスポンスには、ログインページにリダイレクトしないようにAPIに指示する必要のある設定が必要であると思いますしかし、ちょうど401を返すために – Toby

0

おそらく、あなたはフォーム認証を使用しています。デフォルトでは、フォーム認証は、パイプライン(401)内の認証されていないイベントを検出し、それをログインページにリダイレクト(302)に変換します。あなたのクライアントがそのリダイレクトに自動的に従っている場合(ほとんどの場合)、HTTP成功ステータスコード(200)のログインページの内容が最終的に取得されます。

これには2つの合理的にストレートフォワードのソリューションがあります。

  1. (あなたが手に代替認証ミドルウェアを持っていない場合はOK、完全にストレートフォワードではない)フォーム認証を使用しないでくださいが。
  2. HttpResponse.SuppressFormsAuthenticationRedirectプロパティをtrueに設定します。 HttpResponse.SuppressFormsAuthenticationRedirectのドキュメント毎の

デフォルトでは、認証は、ログインページにリダイレクトするために、302 にHTTP 401ステータスコードを変換し形成しています。これは、認証が成功したのに、 承認が失敗した場合、または現在の要求がAJAXまたはWeb サービス要求の場合など、特定のクラスのエラーに対して には適切ではありません。このプロパティは、リダイレクト の動作を抑制し、元のステータスコードをクライアントに送信する方法を提供します。

とプロパティの値について:

フォーム認証のリダイレクトが抑制されなければならない場合。それ以外の場合は 、falseです。

トピックに関する簡単な情報の私の最初の情報源としてのPhil Haackへの全面的な読書については、彼のblog postを参照してください。

関連する問題