2016-11-26 6 views
0

私はフロントエンドとWeb APIの部分を持つasp.netアプリケーションを持っています。私は、モバイルアプリが保護されたWeb APIエンドポイントを使用できるようにしたいと思います。つまり、ネイティブモバイルアプリケーションにログインして認証トークンを処理する必要があります。asp.netからhttp応答としてベアラトークンを取得するには

今、私は私のasp.netアプリケーションにログインすることができる唯一の方法は、デフォルトのasp.net /アカウント/ログインページを経由することです。ログインエンドポイントに投稿すると、返される本文には自分のアプリケーションのHTMLが含まれます。トークンはasp.netによってクッキーに保存されます。

私は私のネイティブモバイルアプリからログインしようとしていますので、私は、HTMLレスポンスを必要としない、と私のトークンを取得するためにクッキーを通過する必要がしたくありません。

はそれだけではなく、自分のアプリケーションのHTMLコンテンツよりも、トークンおよび/またはユーザー詳細を返す別のログインエンドポイントを作成することは可能ですか?これは悪い考えですか?

参考までに、これは私が参照していたデフォルトのasp.netログインハンドラです。

 public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     // This doesn't count login failures towards account lockout 
     // To enable password failures to trigger account lockout, change to shouldLockout: true 
     var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 
     switch (result) 
     { 
      case SignInStatus.Success: 
       return RedirectToLocal(returnUrl); 
      case SignInStatus.LockedOut: 
       return View("Lockout"); 
      case SignInStatus.RequiresVerification: 
       return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
      case SignInStatus.Failure: 
      default: 
       ModelState.AddModelError("", "Invalid login attempt."); 
       return View(model); 
     } 
    } 
+0

* web APIの部分*を追加できますか? –

+0

@Div私のWeb APIコードのどれもが認証を処理しません。 '[Authorize]'属性を通してベアラトークンを検証するだけです –

答えて

1

私はJWT/Owinの組み合わせを考えます。基本的には、ログインに成功した後にトークン(OAuth)を発行するメカニズムが必要で、その後のリクエストのHTTPヘッダーからトークンベアラを消費し、アクセスを許可(または拒否)するミドルウェアが必要です(標準[Authorize]デコレータを使用)。ここでは、JWT(Json Web Token)の使い方について非常にいいです。exampleです。

あなたはOWIN /カタナ自体に慣れていない場合は、公式website上の非常に素晴らしい記事があります。それは非常に便利です。あなたは基本的にちょうど2つのOWINミドルウェア、UseOAuthAuthorizationServerUseJwtBearerAuthenticationがいくつかのNuGetパッケージに由来します。上記の例に従ってください。

トークンベアがネイティブモバイルアプリケーションに格納されていることだけを説明してください。AndroidまたはiOSのいずれかの適切な場所に格納してください。

0

私の電話アプリでは、httpsを使用してサーバー側のAPIを呼び出します。私はここでサンプルコードを提供しています。私はこのコードを実際のプロセスを表示しないように変更しました。必要に応じて変更する必要があります。しかし、Webサービスだけを呼び出すアプローチを示しています。あなたのサービス側の

次の属性を作成します。クライアント側では

using System.Text; 
using System.Security.Cryptography; 
using System.Web.Http.Filters; 
using System.Web.Http.Controllers; 
using System.Net.Http; 

    public class RequireHttpsAttribute : AuthorizationFilterAttribute 
    { 
     public override void OnAuthorization(HttpActionContext actionContext) 
     { 
      if (actionContext.Request.RequestUri.Scheme !=Uri.UriSchemeHttps) 
      { 
       actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden) 
       { 
        ReasonPhrase = "HTTPS Required" 
       }; 
      } 
      else 
      { 

       string UserName; 
       String Password; 

       if (actionContext.Request.Headers.Any(p => p.Key == "UserName") && 
      actionContext.Request.Headers.Any(p => p.Key == "UserName")) 
       { 
        UserName = actionContext.Request.Headers.Where(p => p.Key ==           "UserName").FirstOrDefault().Value.FirstOrDefault(); 

      Password = actionContext.Request.Headers.Where(p => p.Key ==           "UserName").FirstOrDefault().Value.FirstOrDefault(); 

       //do authentication stuff here.. 
      If(Authorized()) 
      { 
       base.OnAuthorization(actionContext); 
          return; 
      } 
      Else 
     { 

       actionContext.Response = new HttpResponseMessage       (System.Net.HttpStatusCode.Forbidden) 
         { 
           ReasonPhrase = "Invalid User or Password" 
         }; 
      } 

       } 

       actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden) 
       { 
        ReasonPhrase = "HTTPS Required" 
       }; 


      } 
     } 

     return ReasonPhrase; 
    } 

をこのように要求します

[RequireHttps] 
    public YOURAPI Get(int id) 
    { 
     //if you got this far then the user is authorized. 
    } 

string ResponseText= String.Empty(); 
using (var client = new HttpClient()) 
       { 
        client.BaseAddress = new Uri("https://YOURAPI/"); 

        client.DefaultRequestHeaders.Accept.Clear(); 
        //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue     ("text/json")); 
        client.DefaultRequestHeaders.Accept.Add(
       new MediaTypeWithQualityHeaderValue("application/json")); 

        client.DefaultRequestHeaders.Add("UserName", UserName); 
        client.DefaultRequestHeaders.Add("Password", Password); 
        // New code: 
        HttpResponseMessage response = await client.GetAsync   ("api/YOURAPIENDPOINT").ConfigureAwait(continueOnCapturedContext: false); 
        if (response.IsSuccessStatusCode) 
        { 
         ResponseText = await response.Content.ReadAsStringAsync(); 
        } 
       } 

APIメソッドは次のようになります。

あなたの走行距離は異なる場合があります。私はこのコードを変更されたものとしてテストしていません。しかし、あなたが望むものを達成する方法のアイデアを得るべきです。

関連する問題