32

以前は を使用していたアプリケーションがあり、しばらく前にfromFormsAuthenticationを使用するように切り替えました。これにより、クレーム ベースの認証を利用できるようになりましたが、使用と実装がかなり面倒でした。だから今私は見ています。IdentityModelWindowsIdentityFrameworkOwinAuthentication

私はフレームワークを見ていOwinAuthenticationますAsp.Net Identity。しかし、Asp.Net Identityフレームワークの現時点での唯一の実装は を使用してEntityModelおり、私はnHibernate. したがって、今のところ、バイパスを試みて、直接Asp.Net Identity使用することを検討しています。「 Identity Framework マジックを無視して、OWIN 認証ミドルウェアを使用して求めるクレームを取得するにはどうすればよいですか?Owin Authentication」のヒントを使用して、最終的に機能するログインを取得することができましたが、クレームを保持する Cookie がかなり大きくなりました。を使用すると、サーバー上で要求をキャッシュするサーバー側のキャッシュ メカニズムを使用でき、Cookie はキャッシュされた情報の単純なトークンを保持するだけでした。に同様の機能はありますか、それとも自分で実装する必要がありますか?IdentityModelOwinAuthentication

私はこれらのボートのいずれかに乗ることになると思います...

  1. Cookie は 3KB のままですが、少し大きいです。
  2. 私が知らないという点IdentityModelでのSessionCachingに似た機能を有効にします。Owin
  3. OwinCookie の肥大化の原因となる情報をキャッシュする独自の実装を作成し、アプリケーションの起動時に構成するときにそれを接続できるかどうかを確認します。
  4. 私はこれをすべて間違ってやっています.私が考えていないアプローチがあるか、何かを誤用してい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);
    }
}
4

3 に答える 3

15

OWIN Cookie 認証ミドルウェアは、セッション キャッシュのような機能をまだサポートしていません。#2はオプションではありません。

#3は正しい方法です。Prabu が提案したように、コードで次のことを行う必要があります。

OnResponseSignIn:

  • context.Identity を一意のキー (GUID) でキャッシュに保存します。
  • 一意のキーが埋め込まれた新しい ClaimsIdentity を作成する
  • context.Identity を新しい ID に置き換えます

OnValidateIdentity:

  • context.Identity から一意のキー クレームを取得します。
  • 一意のキーでキャッシュされた ID を取得する
  • キャッシュされた ID で context.ReplaceIdentity を呼び出します

Cookie を gzip することをお勧めするつもりでしたが、OWIN の TicketSerializer で既に gzip されていることがわかりました。あなたのためのオプションではありません。

于 2013-10-07T18:05:36.820 に答える
8
Provider = new CookieAuthenticationProvider()
{
    OnResponseSignIn = async context =>
    {
        // This is the last chance before the ClaimsIdentity get serialized into a cookie. 
        // You can modify the ClaimsIdentity here and create the mapping here. 
        // This event is invoked one time on sign in. 
    }, 
    OnValidateIdentity = async context => 
    {
        // This method gets invoked for every request after the cookie is converted 
        // into a ClaimsIdentity. Here you can look up your claims from the mapping table. 
    }
}
于 2013-10-05T02:16:54.410 に答える
1

IAuthenticationSessionStore を実装して、Cookie をデータベースに保存できます。

cookie を redis に保存する例を次に示します。

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
SessionStore = new RedisSessionStore(new TicketDataFormat(dataProtector)),
LoginPath = new PathString("/Auth/LogOn"),
LogoutPath = new PathString("/Auth/LogOut"),

});

ここで完全な例をチェックしてください

于 2016-08-03T06:20:11.040 に答える