説明書の作成
権限認証は、ユーザの身元を決定するプロセスであり、ユーザがリソースにアクセスする権限を有するかどうかを決定する。
今日は、JWTのようなトークンベースの認証メカニズムを共有します。
トークンベースの認証メカニズムは、ユーザーの認証情報やセッション情報をサーバー側に保持する必要がありません。これは、トークン認証メカニズムに基づくアプリケーションが、ユーザがどのサーバにログインしたかを考慮する必要がなく、アプリケーションの拡張に便利になることを意味します。
流れはこんな感じでした
- ユーザーがユーザー名パスワードを使用してサーバーを要求する
- サーバが認証するユーザ情報
- サーバは認証を通じてユーザーにトークンを送信します。
- クライアントはトークンを保存し、リクエストごとにトークン値を添付します。
- サーバはトークン値を検証し、データを返す
今日はJWTのような証明書を作りました。
プレゼンテーションプレゼンテーション
IAuthorizationFilterを継承する新規承認フィルタの作成
public class ApiAuthorize : IAuthorizationFilter
{}
許可を適用する必要があり、認証なしでアクセスできる機能を新規作成します。
public class MyAuthentication:Attribute, IFilterMetadata
{
}
public class MyNoAuthentication : Attribute, IFilterMetadata
{
}
認可フィルタでは、リクエストヘッダーにアプリケーション認可機能と認証なしでアクセス可能な機能があるかどうかを判断し、認証なしでアクセス可能な機能がある場合は次のパイプラインに直接進み、アプリケーション認可機能がある場合はトークン判断を行う必要があります
public class ApiAuthorize : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
if (context.Filters.Contains(new MyNoAuthentication()))
{
return;
}
var authorize = context.HttpContext.Request.Headers["MyAuthentication"];
if (string.IsNullOrWhiteSpace(authorize))
{
context.Result = new JsonResult("请求authorize不能为空");
return;
}
if (!MemoryCacheHelper.Exists(authorize))
{
context.Result = new JsonResult("无效的授权信息或授权信息已过期");
return;
}
}
}
いくつかの小さなパートナーが発見したかもしれませんが、トークンにアクセスする方法は、一般的なスキームはキャッシュを使用して処理することです、ここではあまり議論しません。
CacheHelperのコード
public class MemoryCacheHelper
{
public static MemoryCache _cache = new MemoryCache(new MemoryCacheOptions());
/// <summary>
/// 验证缓存项是否存在
/// </summary>
/// <param name="key">缓存Key</param>
/// <returns></returns>
public static bool Exists(string key)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
return _cache.TryGetValue(key, out _);
}
/// <summary>
/// 获取缓存
/// </summary>
/// <param name="key">缓存Key</param>
/// <returns></returns>
public static object Get(string key)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
if (!Exists(key))
throw new ArgumentNullException(nameof(key));
return _cache.Get(key);
}
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">缓存Key</param>
/// <param name="value">缓存Value</param>
/// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
/// <param name="expiressAbsoulte">绝对过期时长</param>
/// <returns></returns>
public static bool AddMemoryCache(string key, object value)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
_cache.Set(key, value,
new MemoryCacheEntryOptions()
{
SlidingExpiration = new TimeSpan(0, 0, 10),
Priority = CacheItemPriority.NeverRemove,
AbsoluteExpiration = DateTime.Now.AddMinutes(1)
});
return Exists(key);
}
}
認証コードはほぼ完成しました。先ほどのプロセスに戻ります。
ユーザはユーザ名パスワードを使用してサーバに要求し、サーバはユーザの情報を認証し、サーバは認証を通じてユーザにトークンを送信します。
商用ソフトウェアでは、ほとんどのインターフェイスは使用する前にアプリケーションライセンスが必要なので、グローバルに登録してStartUpクラスに登録します。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(o=>
{
o.Filters.Add<ApiAuthorize>();
o.Filters.Add<MyAuthentication>();
});
}
トークン生成の原理ここではあまり詳しく説明しませんが、この例ではAES暗号化を使用してトークンを生成し、サーバーの要求トークンインターフェイスに認証なしでアクセスできる機能を追加し、トークンを発行します。
[HttpGet("GetToken")]
[MyNoAuthentication]
public IActionResult GetToken(string UserCode)
{
string token= AESEncrypt.Encrypt(UserCode);
MemoryCacheHelper.AddMemoryCache(token, User);
eturn Ok(token);
}
図のようにPostmanリクエストを使用してトークンを生成する

次に、アプリケーション認証を必要とするインターフェイスを追加します。グローバルアプリケーション認証機能を登録しているので、この機能を持ち歩く必要はありません。
[HttpGet("GetUserInformation")]
public IActionResult GetUserInformation()
{
return Ok(new { Name="123",Age=18,Sex="性别"});
}
図に示すように、tokenなしでpostmanを使用してインターフェイスをリクエストする

図に示すようにpostmanを使用してインターフェイスをリクエストするトークンを使用します。

以上の例で認証プロセスを明確に理解したので、今日の紹介は終わりです!
最后大家如果喜欢我的文章,还烦烦烦给个注目并点个赞,希望 net生态圏好!