外部認証/登録を許可するための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プロジェクトが必要です。すべてのリクエストに対して適切に認証されます。正しいパスを教えてください。ありがとうございます。
あなたがする必要があるのはこれらのステップに従うことです
これが私たちのアーキテクチャになります
これは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");
}
}
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");
}
}