2017-02-24 18 views
-1

デフォルトでは、ASP .NET MVCと承認システムを使用してWebアプリケーションを作成しました。私はIdentityRoleを設定し、外部プロバイダを介して入力しました。現在のデータベースを使用して、自分のデータコンテキストを作成しました。今はXamarin.Androidアプリを作成してデータベースに接続したいので、簡単なAPIが必要です。ただし、このAPIにアクセスする機能は、特定の役割を持つユーザーのみが使用できました。 APIはとてもシンプルなので、WCFまたはWebAPIプロジェクトの下書きに追加したくありません。どのように最善を尽くすか?ロールを使用したシンプルなASP .NET MVC APIコントローラ

+1

のように入力する必要があります。ロールプロバイダはASP.NETメンバシップのコンセプトですが、あなたの質問は完全に異なる認証システムであるasp.net-identityとタグ付けされています。どちらですか? –

+0

asp .netアイデンティティを意味します。間違った言葉をお詫びします。 – starmucks

答えて

0

この質問に完全に答えて、このトピックを閉じることができます。私は、モバイルクライアントがASP.NET MVC上の既存のサイトに接続する機能を追加する方法を探してきました。私の検索では、私は偉大な記事に出くわしましたJustin Hyland on March 2, 2014 原則として、この記事のすべてがよく書かれていますが、わかりやすくするために少し貢献したいと思います。 は、セットアップの下WebAPIConfigが必要

がWebApiConfig登録方法

に次のコードで追加したと述べた。しかし、我々はケースASP.NET MVCを考慮すれば、私たちは、このようなファイルを持っていません。それはすべて非常に簡単です、あなたはフォルダApp_Startを作成するためにそのようなファイルが必要です。ファイルの内容は、記事のままにすることができます。

必然的に発生するバグを取り除くには、Microsoft.AspNet.WebApiとMicrosoft.AspNet.WebApi.Owinという2つのナゲットパッケージをインストールする必要があります。

優秀!今度はトークンを取得し、トークンをクエリに追加するメソッドに移り、必要なデータを属性[Authorize]で閉じることができます。

小さな発言。アーティクルからAuthenticateメソッドへの特定のロールに対して閉じられたメソッドにアクセスする必要がある場合は、数行のコードを追加する必要があります。例えば、

identity.AddClaim(new Claim(ClaimTypes.Role, role)); 

が役割あなたが次のことを得ることができます:

identity.AddClaim(new Claim(ClaimTypes.Name, user)); 

は、行を追加します。すぐに行の後

var userIdentity = UserManager.FindAsync(user, password).Result; 
var role = RoleManager.FindById(userIdentity.Roles.First().RoleId).Name; 

ユーザーとパスワードは要求を送信する必要が。

また、要求を送信して応答を受け取るコードの例を挙げたいと思います。探してすぐにコーディングを開始する必要はありません。

 async Task<string> GetToken(string userName, string password) 
     { 
     var content = new FormUrlEncodedContent(new[] 
     { 
      new KeyValuePair<string, string>("user", userName), 
      new KeyValuePair<string, string> ("password", password) 
     } 
     ); 

     using (var client = new HttpClient()) 
     { 
      HttpResponseMessage response = await client.PostAsync(APP_PATH + "/Authenticate", content); 
      var result = await response.Content.ReadAsStringAsync(); 
      return result; 
     } 
    } 

    async Task<string> GetUserInfo(string token) 
    { 
     using (var client = CreateClient(token)) 
     { 
      var response = await client.GetAsync(APP_PATH + "/ValidateToken"); 
      return await response.Content.ReadAsStringAsync(); 
     } 
    } 

    HttpClient CreateClient(string accessToken = "") 
    { 
     var client = new HttpClient(); 
     if (!string.IsNullOrWhiteSpace(accessToken)) 
     { 
      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 
     } 
     return client; 
    } 

すべては、正しい順序で適切なメソッドを呼び出すだけです。それが誰かにとって有用であることを願っています。 P.P. Visual Studioで新しいプロジェクトを作成してこの機能を利用する場合は、enter image description here

3

まず、Web Apiを使用するために別個のプロジェクトは必要ありません。 MVCとWeb Apiの両方を同じプロジェクトで使用できます。サイト内のAJAXリクエストなどのエンドポイントの場合、JSONまたはXMLを返すMVCアクションを作成するだけで問題ありませんが、実際のAPIについて話しているのであれば、かなり単純化されていても、Go Web API 。

[Authorize]属性を使用して、Web APIのアクションをMVCアクションと同じように保護できます。ロールで制限する必要がある場合は、そのロールにロールを渡すだけです。しかし、ここで大きな違いは、特にあなたがモバイルアプリを提供している場合は、リクエストとともに承認を渡す必要があることです。これは、一般に、ベアラトークンと共にAuthorizationヘッダーを使用して実行されます。基本的には、ユーザーにサインインしてトークンを返すエンドポイントを設定する必要があります。次に、承認を必要とする後続の要求には、ヘッダー内のトークンが含まれます。

+0

これは、WebAPIがすぐに提供するものです。つまり、ベアラトークンを使ってすぐに使えるソリューションです。しかし、私が指摘したように、私はこのためだけにプロジェクト全体を追加したくありません。この機能が私の決定を膨らませないようにするにはどうすればよいですか? – starmucks