我有一个过go 使用FormsAuthentication的应用程序,不久前我将它从WindowsIdentityFramework改为使用IdentityModel,这样我就可以从基于声明的身份验证中获益,但它的使用和实现相当难看.所以现在我看到的是OwinAuthentication.

我看到的是OwinAuthenticationAsp.Net Identity框架.但是Asp.Net Identity框架目前唯一的实现使用EntityModel,而我使用的是nHibernate.所以现在我想试着绕过Asp.Net Identity,直接使用Owin Authentication.我终于能够使用来自"How do I ignore the Identity Framework magic and just use the OWIN auth middleware to get the claims I seek?"的提示获得一个工作登录,但现在我的cookie中包含索赔的内容相当大.当我使用IdentityModel时,我能够使用服务器端缓存机制来缓存服务器上的声明,而cookie只为缓存的信息保存了一个简单的令牌.OwinAuthentication中有没有类似的特性,或者我必须自己实现它?

我想我会在其中一艘船上.

  1. cookies 保持3KB,哦,它有点大.
  2. 启用一个类似于我不知道的OwinIdentityModel的SessionCaching的功能.
  3. 编写我自己的实现来缓存导致cookieinflating 的信息,并查看在应用程序启动时配置Owin时是否可以将其连接起来.
  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),
            });
        }
    }
    

UPDATE

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);
    }
}

推荐答案

owin cookie身份验证中间件还不像功能那样支持会话缓存.#2不是一个选项.

#3是正确的 Select .正如Prabu所建议的,您应该在代码中执行以下操作:

OnResponseSignIn:

  • 使用唯一键(GUID)将context.Identity保存在缓存中
  • 创建一个嵌入唯一密钥的新ClaimsEntity
  • 替换上下文.身份与新身份

OnValidateId实体:

  • 从上下文中获取唯一密钥声明.身份
  • 通过唯一密钥获取缓存的标识
  • 调用上下文.用缓存的标识替换标识

我本打算建议您压缩cookie,但是我发现owin已经在它的TicketSerializer中这样做了.你没有 Select 的余地.

Asp.net相关问答推荐

Swashbuckle 通过 .NET 应用程序中的 XML 注释使用格式标识符

系统日期时间?与 System.DateTime

IE10 SCRIPT5009:__doPostBack未定义

Window.Open 使用 PDF 流而不是 PDF 位置

如何在 ASP.NET 中使用时区?

RestSharp 获取请求的完整 URL

如何在asp.net中判断会话是否过期

Webapi、Webhost和Owin的关系

使用 Elmah 处理 Web 服务中的异常

如何获取 ActionLink 的工具提示?

ASP.NET 会话超时测试

在 ASP.NET 4.5 WebForms 中通过 bundle.config 与 BundleConfig.cs Bundle 资源

使用 LINQ 进行递归控制搜索

无法序列化会话状态

C# 7 本地函数未按预期工作且未显示错误

如何使用 WebRequest 发布数据并从网页获取响应

覆盖静态方法

如何告诉 RadioButtonList 不生成表格

错误处理(向客户端发送 ex.Message)

jQuery Ajax 调用 - 成功设置变量值