【问题标题】:How do IIdentity, IPrincipal, OWIN, IdentityUser and IUser<string> fit together?IIdentity、IPrincipal、OWIN、IdentityUser 和 IUser<string> 如何组合在一起?
【发布时间】:2015-02-08 03:44:21
【问题描述】:

我正在努力找出哪些 .Net 身份验证概念在 OWIN 世界中仍然相关,哪些现在已经过时。从 OWIN 之前的 ASP.Net 时代开始,我习惯于处理 .Net 结构:FormsAuthentication、FormsAuthCookie、IPrincipal、IIdentity 以及 IPrincipal 的自定义实现(继承自 GenericPrincipal)。使用最新版本的 MVC (5),大部分身份验证似乎已更改为基于 OWIN。我特别想了解两件事:

1) IPrincipal 和 IIdentity 和 GenericPrincipal 在哪里适合? 使用 FormsAuthentication,自定义数据可以存储在 FormsAuth cookie 中。然后可以在 ASP.Net PostAuthenticate 事件中使用它来创建一个 CustomPrincipal 对象,并覆盖 HTTPContext 上的默认 IPrincipal(根据下面的代码示例)。 OWIN 如何(或如何)改变这一点?:

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) 
{
    //Decrypt forms authentication cookie and retrieve some userdata        

    ...

    //Create CustomPrincipal (which inherits from GenericPrincipal)
    var principal = new CustomPrincipal(userId, roles, someAdditionalUserDataFromCookie);

    //Replace standard IPrincipal object on HTTPContext with custom principal
    HttpContext.Current.User = newUser
}

2) 自定义身份验证数据可以存储在哪里? 在 OWIN 之前的日子里,我使用 AuthCookie 的 UserData 值来存储自定义身份信息(除了用户名) - 例如 OrgID .现在可以将其作为 Claims 存储在 ClaimsIdentity 对象中吗?这是一个好主意吗?它仍然可以存储在 AuthenticationTicket 中吗?我看错了吗?!

感谢您的帮助。

【问题讨论】:

    标签: asp.net .net asp.net-mvc authentication owin


    【解决方案1】:

    您将使用CookieAuthenticationMiddleware 而不是FormsAuthenticationModuleCookieAuthenticationMiddleware 仍然使用身份验证票创建 cookie,但格式不同。使用CookieAuthenticationMiddleware,一切都是为从头开始的索赔而设计的。因此,默认情况下,您会得到 ClaimsPrincipalClaimsIdentity,尽管这些类实现了 IPrincipalIIdentity

    关于自定义身份验证数据,将它们存储为身份的声明部分。新世界的一件好事是,您不再需要使用PostAuthenticate 根据票证中的自定义数据来恢复您的主体。如果您在调用 SignIn 之前使用所有必需的声明创建您的身份,CookieAuthenticationMiddleware 会负责将身份的声明部分序列化到 cookie 中的票证中,然后再完整地返回到身份中。此外,您不会使用HttpContext.Current.User 来读取主体。您将使用请求对象上可用的扩展方法从 OWIN 上下文中读取,如下所示。

    Request.GetOwinContext().Authentication.User 返回ClaimsPrincipal Request.GetOwinContext().Request.User 返回与上面相同但与 IPrincipal 相同

    在控制器中,您可以使用User,即IPrincipal,它再次从上下文中返回一个。

    【讨论】:

    • 谢谢巴德里,效果很好。不再发布身份验证请求垃圾。我将自定义数据放入索赔中。我从 IPrincipal 创建了一些扩展方法,以抽象的方式将它们提取出来。一个不错的干净解决方案!
    猜你喜欢
    • 2015-10-07
    • 2023-04-08
    • 2011-01-31
    • 2012-05-31
    • 2017-09-06
    • 2014-07-10
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多