サードパーティの開発者がアプリケーションのデータにアクセスするために使用するASP.NET Web APIを使用してRESTful Webサービスを構築したいと考えています。
Visual Studioでは、新しいASP.NETプロジェクトを作成することにしました。これに従いました tutorial ですが、別のテンプレートを選択します:Web APIテンプレート。チュートリアルで説明したように、標準のユーザーロールテーブルでMySQLデータベースを使用します。
このテンプレートには、新しいユーザーを登録するための非常に興味深いメソッドが多数付属していますが、デフォルトのログイン要求はありません。私は私がやっていることを理解せずにこれを書いた:
// POST api/Account/Login
[Route("Login")]
public IHttpActionResult Login(LoginBindingModel model)
{
ClaimsIdentity ci = new ClaimsIdentity();
// ...
// ...
Authentication.SignIn(ci);
return Ok();
}
セキュリティの仕組みを説明したドキュメントを含む良いサンプルを見つけることなく、セキュリティについて多くのことを読みました。 Web APIで単純なログインメソッドを実装するのは非常に難しいようです。
このテンプレートにログイン方法がない理由を説明してください。ログイン方法のサンプルはありますか?そして、要求を認証するためにクライアントアプリケーションに何を送り返す必要があります。これはトークンで動作していますか?
通常は、そのメソッドにログインロジックを実装し、トークンを返します。トークンは、APIへの各呼び出しで検証されます。
詳細はこちらをご覧ください
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
新しいASP.NET Web Application
-> Web API
->認証の変更-> Individual User Accounts
を作成した場合。 App_Start
-> Startup.Auth.cs
をご覧ください。
次のようなものが含まれている必要があります。
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
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
これは、アクセストークンのリクエスト、たとえばリクエストを送信できることを意味します。
その後、アクセストークンが機能することを確認できます。
このトークンを使用すると、ユーザーがアクセスできるすべての保護されたリソースにアクセスできます。
サードパーティの開発者向けにAPIを構築する場合は、OAuth 2.0フローを使用してそれを保護する必要があります。リソース所有者のパスワード資格情報を実装する@dariogriffoが指示した詳細な投稿あなたの場合に良い流れ。
ログイン用のエンドポイントを作成する必要はありません。「/ token」などのエンドポイントを呼び出すときに、ユーザーにOAuthベアラートークンを発行するようにOwinミドルウェアを使用してAPIを構成します。 、その後、ユーザーはAuthorizationヘッダー内の各リクエストとともにこのトークンを送信し続けます。これについて詳しく読む token based authentication .
ヘルパークラスであるOthersの場合:
namespace WeBAPITest
{
#region Using Statements:
using System.Net.Http;
using System.Collections.Generic;
using Newtonsoft.Json;
#endregion
public class HttpWebApi
{
#region Fields:
private static readonly HttpClient client = new HttpClient();
#endregion
#region Properties:
/// <summary>
/// The basr Uri.
/// </summary>
public string BaseUrl { get; set; }
/// <summary>
/// Username.
/// </summary>
protected internal string Username { get; set; }
/// <summary>
/// Password.
/// </summary>
protected internal string Password { get; set; }
/// <summary>
/// The instance of the Root Object Json Deserialised Class.
/// </summary>
internal Rootobject Authentication { get; set; }
/// <summary>
/// The Access Token from the Json Deserialised Login.
/// </summary>
public string AccessToken { get { return Authentication.access_token; } }
#endregion
public HttpWebApi(string baseurl)
{
// Init Base Url:
BaseUrl = baseurl;
}
/// <summary>
/// Get from the Web API.
/// </summary>
/// <param name="path">The BaseUrl + path (Uri.Host + api/Controller) to the Web API.</param>
/// <returns>A Task, when awaited, a string</returns>
public async System.Threading.Tasks.Task<string> Get(string path)
{
if (Authentication.access_token == null)
throw new System.Exception("Authentication is not completed.");
// GET
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", Authentication.access_token);
return await client.GetStringAsync(BaseUrl + path);
}
/// <summary>
/// Logs In and populates the Authentication Variables.
/// </summary>
/// <param name="username">Your Username</param>
/// <param name="password">Your Password</param>
/// <returns>A Task, when awaited, a string</returns>
public async System.Threading.Tasks.Task<string> Login(string username, string password)
{
// Set Username:
Username = username;
// Set Password:
Password = password;
// Conf String to Post:
var Dic = new Dictionary<string, string>() { { "grant_type", "password" }, { "username", "" }, { "password", "" } };
Dic["username"] = username;
Dic["password"] = password;
// Post to Controller:
string auth = await Post("/Token", Dic);
// Deserialise Response:
Authentication = JsonConvert.DeserializeObject<Rootobject>(auth);
return auth;
}
/// <summary>
/// Post to the Web API.
/// </summary>
/// <param name="path">The BaseUrl + path (Uri.Host + api/Controller) to the Web API.</param>
/// <param name="values">The new Dictionary<string, string> { { "value1", "x" }, { "value2", "y" } }</param>
/// <returns>A Task, when awaited, a string</returns>
public async System.Threading.Tasks.Task<string> Post(string path, Dictionary<string, string> values)
{
// Add Access Token to the Headder:
if (Authentication != null)
if (Authentication.access_token != "")
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", Authentication.access_token);
// Encode Values:
var content = new FormUrlEncodedContent(values);
// Post and get Response:
var response = await client.PostAsync(BaseUrl + path, content);
// Return Response:
return await response.Content.ReadAsStringAsync();
}
/// <summary>
/// Register a new User.
/// </summary>
/// <param name="username">Your Username, E-Mail</param>
/// <param name="password">Your Password</param>
/// <returns>A Task, when awaited, a string</returns>
public async System.Threading.Tasks.Task<string> Register(string username, string password)
{
// Register: api/Account/Register
var Dic = new Dictionary<string, string>() { { "Email", "" }, { "Password", "" }, { "ConfirmPassword", "" } };
Dic["Email"] = username;
Dic["Password"] = password;
Dic["ConfirmPassword"] = password;
return await Post("api/Account/Register", Dic);
}
}
/// <summary>
/// For Json Deserialisation.
/// </summary>
internal class Rootobject
{
/// <summary>
/// The Web Api Access Token. Gets added to the Header in each communication.
/// </summary>
public string access_token { get; set; }
/// <summary>
/// The Token Type
/// </summary>
public string token_type { get; set; }
/// <summary>
/// Expiry.
/// </summary>
public int expires_in { get; set; }
/// <summary>
/// The Username.
/// </summary>
public string userName { get; set; }
/// <summary>
/// Issued.
/// </summary>
public string issued { get; set; }
/// <summary>
/// Expiry.
/// </summary>
public string expires { get; set; }
}
}
Visual Studioのデフォルトの未編集のWeb Apiテンプレート用に特別に設計されています。
次に:
HttpWebApi httpWebApi = new HttpWebApi("http://localhost/");
await httpWebApi.Login("email", "password");
richTextBox1.AppendText(await httpWebApi.Get("api/Account/UserInfo") + Environment.NewLine);
これが他の人にも役立つことを願っています!