web-dev-qa-db-ja.com

Web API –ベアラートークンで認証

外部認証/登録を許可するためのMVCアプリケーションを作成しました。必要なすべてのコンポーネント(Owin、EF、登録、ログイン、ログアウト)で作成されており、アプリケーションですべての基本的なアクティビティを実行できます。

ここで、Webアプリケーションをモバイルアプリでも使用されるWebAPIと統合したいと思います。 Web API呼び出しで認証に固執しました(Webアプリケーションから受け取ったベアラートークンを使用)。

OWINミドルウェアを有効にしてWEBAPIプロジェクトを作成する例を見ました。しかし、外部認証プロセスを一元化して、Webアプリケーションとモバイルアプリケーションの両方にトークンを使用する方法がわかりません。そしてANGULARには行きたくないまたはシングルページアプリケーション。誰かが私にこの問題を修正するための正しい技術的な道を提案できますか?ありがとうございました。

ステップ1:

Visual Studio 2015で、個別ログインを有効にしてMVCプロジェクトを作成しました。そして、私がグーグル開発者コンソールですべてを構成したキーを構成しました。私のStartup.csは次のコードになります

 public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context, user manager and signin manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
        });

ステップ2:

ローカルDBをポイントしてアプリを実行するようにwebconfigファイルを変更しました。Gmailアカウントを使用してGoogleから正常にログインでき、ユーザーの詳細がDBのASPUSerTablesに正常に追加されます。

ステップ3:

ここで、DBに接続してMVC Webアプリケーションとモバイルアプリケーションにデータを取得するWEBAPIプロジェクトを作成したいと思いました(ここでは認証の部分で立ち往生しています)。モバイルアプリ(Xamarin)にもサードパーティの認証を使用し、モバイルアプリとMVCWebサイトの共通APIを使用する必要があります

ステップ4だから、WEBアプリケーション(ステップ1)の代わりに、以下のようなWEB APIプロジェクトを作成して、認証トークンをStartup.csで返す必要があると思いました。そして、そのCookieをWebサイトに保存して、後続のリクエストを渡します。

app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Configure the application for OAuth based flow
        PublicClientId = "self";
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            // In production mode set AllowInsecureHttp = false
            AllowInsecureHttp = true
        };

ANGULARを使用したくないので、WebApplication(MVC)とWEBAPIプロジェクトが必要です。すべてのリクエストに対して適切に認証されます。正しいパスを教えてください。ありがとうございます。

4
DevExpress

あなたがする必要があるのはこれらのステップに従うことです

  • 個別のユーザーアカウント認証を使用してWebAPIプロジェクトを作成します。
  • これで、登録用のAPI、パスワードの変更、およびユーザーのトークンを生成するためのAPIエンドポイントを使用する準備が整いました。
  • 別のプロジェクトを作成しますが、今回は[〜#〜] mvc [〜#〜]withNo Authentication同じソリューションで。

これが私たちのアーキテクチャになります

enter image description here

これはAPIコントローラーです

[Authorize]
public class ValuesController : ApiController
{
      [HttpGet]
      public IEnumerable<string> Get()
      {
         return new string[] { "values1", "values2" };
      }
}

これはMVCコントローラーです

public class MVCValuesController : Controller
{
     HttpClient client;

     // web api Url
     string url = string.Format("http://localhost:60143/api/Values");
     string bearerToken = string.Format("bearer token from web api");
     public MVCValuesController()
     {
        client = new HttpClient(); 
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Accept.Add("Authorization", "Bearer " + bearerToken);
     }

     public ActionResult GetValues()
     {
         HttpResponseMessage responseMessage = client.Get(url);
         if (responseMessage.IsSuccessStatusCode)
         {
             var responseData =   responseMessage.Content.ReadAsStringAsync().Result;
             var jsonResponse = JsonConvert.DeserializeObject<List<string>>(responseData);
             return View(jsonResponse);
         }
         return View("Error");
     }
}

ここでは非同期を使用していませんが、使用できます。また、実行時に両方のプロジェクトを開始する必要があります。ソリューションを右クリックしてSet Start Up projectsをクリックすると、複数のプロジェクトを選択してアクションをStartとして設定できます。

public class MVCAccountController : Controller
{
     HttpClient client;

     // web api Url
     string url = string.Format("http://localhost:60143/");
     //string bearerToken = string.Format("bearer token from web api");
     public MVCValuesController()
     {
        client = new HttpClient(); 
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
         // just adding a JObject you can create a class 

         JObject tokenJobject = new JObject(
                                        new JProperty("Email", "[email protected]"),
                                        new JProperty("Password", "Pass123"));
                                        new JProperty("ConfirmPassword", "Pass123"));
            HttpContent baseContent = new StringContent(tokenJobject.ToString(), Encoding.UTF8, "application/json");
        //client.DefaultRequestHeaders.Accept.Add("Authorization", "Bearer " + bearerToken);


     }

     public async Task<ActionResult> GetValues()
     {
         string requestUri = string.Format("api/Account/Register");
         HttpResponseMessage responseMessage = await client.PostAsync(requestUri, baseContent);
         if (responseMessage.IsSuccessStatusCode)
         {
             var responseData =   responseMessage.Content.ReadAsStringAsync();
             var jsonResponse = JsonConvert.DeserializeObject<string>(responseData);
             return View(jsonResponse);
         }
         return View("Error");
     }
}
3
Jawand Singh
 public class MVCValuesController : Controller 
 {
       HttpClient client;

       // web api Url
       string url = string.Format("http://localhost:60143/api/Values");
       string bearerToken = string.Format("bearer token from web api");

       public MVCValuesController()
       {
          client = new HttpClient(); 
          client.BaseAddress = new Uri(url);
          client.DefaultRequestHeaders.Accept.Clear();
          client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
          client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
       }

       public ActionResult GetValues()
       {
          HttpResponseMessage responseMessage = client.Get(url);
          if (responseMessage.IsSuccessStatusCode)
          {
              var responseData =   responseMessage.Content.ReadAsStringAsync().Result;
              var jsonResponse = JsonConvert.DeserializeObject<List<string>>(responseData);
              return View(jsonResponse);
          }
          return View("Error");
       }
 }
0
Rajesh Kashyap