JWTをご覧ください。それは以下のように動作します:
サーバー側: WebサービスまたはWeb APIのログインコントローラには、usernameとpwdを受け入れ、キーを使用してトークンを生成するログインメソッドがあります。
public string Login(string username, string password)
{
if (!VerifyUserPassword(username, password))
return "Wrong access";
List<Claim> claims = GetUserClaims(username);
RSACryptoServiceProvider publicAndPrivate = new RSACryptoServiceProvider();
publicAndPrivate.FromXmlString(File.ReadAllText(HostingEnvironment.MapPath("~/AppKey.xml")));
JwtSecurityToken jwtToken = new JwtSecurityToken
(
issuer: "http://example.com",
audience: "http://receiver.com",
claims: claims,
signingCredentials: new SigningCredentials(new RsaSecurityKey(publicAndPrivate), SecurityAlgorithms.RsaSha256Signature),
expires: DateTime.Now.AddDays(1)
);
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
string tokenString = tokenHandler.WriteToken(jwtToken);
return tokenString;
}
ここで使用される「AppKey.xml」ファイルは、後でトークンをデコードするために使用されるトークンに署名するためのキーです。次に、このような以前使用されたキーファイルを使用してトークンを検証するために、customAuthorizeAttributeを作成することができます(Webサービスについてはわかりませんが、別の方法が必要です)。
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
AuthenticationHeaderValue token = actionContext.Request.Headers.Authorization;
if (ValidateToken(token.ToString()))
return;
else
throw new HttpResponseException(System.Net.HttpStatusCode.Unauthorized);
}
private bool ValidateToken(string TokenString)
{
bool result = false;
try
{
SecurityToken securityToken = new JwtSecurityToken(TokenString);
JwtSecurityTokenHandler securityTokenHandler = new JwtSecurityTokenHandler();
RSACryptoServiceProvider publicAndPrivate = new RSACryptoServiceProvider();
publicAndPrivate.FromXmlString(File.ReadAllText(HostingEnvironment.MapPath("~/AppKey.xml")));
TokenValidationParameters validationParameters = new TokenValidationParameters()
{
ValidIssuer = "http://example.com",
ValidAudience = "http://receiver.com",
IssuerSigningKey = new RsaSecurityKey(publicAndPrivate)
};
ClaimsPrincipal claimsPrincipal = securityTokenHandler.ValidateToken(TokenString, validationParameters, out securityToken);
result = true;
}
catch (Exception ex)
{
result = false;
}
return result;
}
}
ここで、権限を使用する場合は、このcustomAuthoorize属性をこのようなメソッドに置くことができます。
[CustomAuthorize]
[HttpPost]
public string TestAuthorization()
{
return "Success!";
}
クライアント側: Angular2アプリケーションでは、このようにあなたのためのサーバにリクエストを送信する前に認証ヘッダーにトークンを挿入するサービスを実装します。
export class DataService {
constructor(private http: Http) { }
postService(url: string, body: any, options?: RequestOptions): Observable<any> {
let tempOptions: RequestOptions = options;
if (tempOptions)
tempOptions.headers.append('Authorization', localStorage.getItem("appToken"));
else {
tempOptions = new RequestOptions();
let hd = new Headers();
hd.append('Authorization', localStorage.getItem("appToken"));
tempOptions.headers = hd;
}
return this.http.post(url, body, tempOptions).map((result: Response) => <any>result.json());
}
}
実際のコンポーネントクラスでは、単純に実装します。
Login() {
this.myDataService.postService('http://YOURAPI/Login?username=xyz&password=xyz', null).subscribe(result => {
let token = result;
localStorage.setItem("appToken",token);
this.message="Login successful";
});
は、loginメソッド内のローカルストレージにトークンを保存し、作成したばかりの角度サービスを介してサーバーのメソッドを呼び出すたびその後、認証トークンはリクエストヘッダに注入されます。
YourMethod() {
this.myDataService.postService('http://YourAPI/TestAuthorization', null).subscribe(result => {
this.message = result;
});
すべて設定されています。楽しい!
私がよく理解していると、ユーザーがログインするたびに、パスワード+キーから新しいトークンが生成されますか?しかし、それが新しいものであれば、どのようにしてdb内のトークンを一致させることができますか? ファイルAppKey.xmlに含まれるキーはどのように埋められていますか?生成された?または私によって選んだ? フロントエンドの場合、ブラウザを閉じるときにローカルストレージに格納されているデータが消去されますか? トークンに期限切れの時間を設定すると、remember me関数が機能しますか? – anais1477
これは単なるサンプルコードです。要件に応じて変更する必要があります。このコードは、ログインごとに新しいトークンを生成します。 dbでトークンを保存する必要はありません。キーで署名し、同じキーで検証します。キーを生成する方法はたくさんあります。ちょうどその周りにGoogleまたは私は時間を得るときに私はいくつかのコードを掲載します。トークンに有効期限を追加するか、使用できるリフレッシュトークンの概念があります。 – Prabi