以前は を使用していたアプリケーションがあり、しばらく前にfromFormsAuthentication
を使用するように切り替えました。これにより、クレーム ベースの認証を利用できるようになりましたが、使用と実装がかなり面倒でした。だから今私は見ています。IdentityModel
WindowsIdentityFramework
OwinAuthentication
私はフレームワークを見ていOwinAuthentication
ますAsp.Net Identity
。しかし、Asp.Net Identity
フレームワークの現時点での唯一の実装は を使用してEntityModel
おり、私はnHibernate
. したがって、今のところ、バイパスを試みて、直接Asp.Net Identity
使用することを検討しています。「 Identity Framework マジックを無視して、OWIN 認証ミドルウェアを使用して求めるクレームを取得するにはどうすればよいですか?Owin Authentication
」のヒントを使用して、最終的に機能するログインを取得することができましたが、クレームを保持する Cookie がかなり大きくなりました。を使用すると、サーバー上で要求をキャッシュするサーバー側のキャッシュ メカニズムを使用でき、Cookie はキャッシュされた情報の単純なトークンを保持するだけでした。に同様の機能はありますか、それとも自分で実装する必要がありますか?IdentityModel
OwinAuthentication
私はこれらのボートのいずれかに乗ることになると思います...
- Cookie は 3KB のままですが、少し大きいです。
- 私が知らないという点
IdentityModel
でのSessionCachingに似た機能を有効にします。Owin
Owin
Cookie の肥大化の原因となる情報をキャッシュする独自の実装を作成し、アプリケーションの起動時に構成するときにそれを接続できるかどうかを確認します。私はこれをすべて間違ってやっています.私が考えていないアプローチがあるか、何かを誤用してい
Owin
ます.public class OwinConfiguration { public void Configuration(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = "Application", AuthenticationMode = AuthenticationMode.Active, CookieHttpOnly = true, CookieName = "Application", ExpireTimeSpan = TimeSpan.FromMinutes(30), LoginPath = "/Login", LogoutPath = "/Logout", ReturnUrlParameter="ReturnUrl", SlidingExpiration = true, Provider = new CookieAuthenticationProvider() { OnValidateIdentity = async context => { //handle custom caching here?? } } //CookieName = CookieAuthenticationDefaults.CookiePrefix + ExternalAuthentication.ExternalCookieName, //ExpireTimeSpan = TimeSpan.FromMinutes(5), }); } }
更新 Hongyeが提供した情報を使用して目的の効果を得ることができ、以下のロジックを思いつきました...
Provider = new CookieAuthenticationProvider()
{
OnValidateIdentity = async context =>
{
var userId = context.Identity.GetUserId(); //Just a simple extension method to get the ID using identity.FindFirst(x => x.Type == ClaimTypes.NameIdentifier) and account for possible NULLs
if (userId == null) return;
var cacheKey = "MyApplication_Claim_Roles_" + userId.ToString();
var cachedClaims = System.Web.HttpContext.Current.Cache[cacheKey] as IEnumerable<Claim>;
if (cachedClaims == null)
{
var securityService = DependencyResolver.Current.GetService<ISecurityService>(); //My own service to get the user's roles from the database
cachedClaims = securityService.GetRoles(context.Identity.Name).Select(role => new Claim(ClaimTypes.Role, role.RoleName));
System.Web.HttpContext.Current.Cache[cacheKey] = cachedClaims;
}
context.Identity.AddClaims(cachedClaims);
}
}