IIdentity,IPrincipal,OWIN,IdentityUser和IUser <string>如何组合在一起?</string>

时间:2014-12-10 03:04:50

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

我正在努力弄清楚哪些.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 。现在可以将它存储为ClaimsIdentity对象中的声明吗?这是一个好主意吗?它仍然可以存储在AuthenticationTicket中吗?我看这一切都错了吗?!

感谢您的帮助。

1 个答案:

答案 0 :(得分:9)

您将使用CookieAuthenticationMiddleware代替FormsAuthenticationModuleCookieAuthenticationMiddleware仍然使用身份验证票证创建cookie,但格式不同。对于CookieAuthenticationMiddleware,事情是专为从头开始的索赔而设计的。因此,默认情况下,您会ClaimsPrincipal获得ClaimsIdentity,但这些类会实现IPrincipalIIdentity

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

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

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