我有许多现有的ASP.NET MVC Web应用程序都使用ASP.NET成员身份和表单身份验证而不使用OWIN,但我希望在.NET Core中开发新的应用程序1.1使用IdentityServer4进行身份验证。我有一个使用自定义用户存储实现的IdentityServer,因此旧的ASP.NET成员资格数据库中的现有用户可以登录到我的IdentityServer(请参阅this StackOverflow问题以获取更多相关信息),但ASP创建的身份验证cookie。使用表单身份验证的旧应用程序无法识别NET身份。
我希望在较旧的Forms身份验证应用和使用ASP.NET身份的较新应用之间进行单点登录,最好尽可能少地对旧应用进行更改。有没有办法让ASP.NET Identity生成表单身份验证可以理解的身份验证cookie?
我认为在这两种情况下,cookie的内容都是序列化和加密的6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos6Entre Ríos[{"prov":null},{"prov":null},{"prov":null},{"prov": null},{"prov":null},{"prov":null},{"prov":null},{" prov":null},{"prov":null},{"prov":null},{"prov":nu ll},{"prov":null},{"prov":null},{"prov":null},{"pr ov":null},{"prov":null},{"prov":null}]
所以看起来我的一大绊脚石就是让Forms Authentication应用程序和ASP.NET Identity应用程序都在关于加密/解密cookie的相同页面。由于Forms Authentication使用web.config文件中的ClaimsPrincipal
元素加密cookie,而.NET Core中的ASP.NET Identity使用DPAPI,因此我必须弄清楚如何弥合这一差距。也许是这样的?
Startup.cs
<machineKey>
FormsAuthenticationDataProtector.cs
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure<IdentityOptions>(options =>
{
...
options.Cookies.ApplicationCookie.DataProtectionProvider =
new FormsAuthenticationDataProtector();
...
});
}
但我不知道public class FormsAuthenticationDataProtector : IDataProtector
{
public IDataProtector CreateProtector(string purpose)
{
return this;
}
public byte[] Protect(byte[] plaintext)
{
// TODO: Mimic the Forms Authentication encryption algorithm.
}
public byte[] Unprotect(byte[] protectedData)
{
// TODO: Mimic the Forms Authentication decryption algorithm.
}
}
和Protect()
方法的主体应该是什么。
答案 0 :(得分:0)
This discussion我在GitHub上使用了几个ASP.NET身份和IdentityServer开发人员非常有帮助。关于在Forms身份验证和ASP.NET身份之间共享cookie的问题的简短回答是“#34;你疯了!&#34;幸运的是,有最低限度的选择。
布朗克艾伦指着我IdentityServer's GitHub repo for client examples。对我来说,我认为MvcFormPostClient example将会成功。在没有OWIN或ASP.NET身份的旧MVC应用程序中实现OpenID Connect实际上并不难。