使用IdentityServer3我需要在用户完成注册过程后自动登录并将本地用户重定向回客户端应用程序.有一种优雅的方式来做到这一点?从我的挖掘中我怀疑不是,在哪种情况下我可以用来实现这个目标?
我能够使用自定义用户服务为外部用户实现此目的,但这使用了部分登录.但是,对于本地用户,在用户名和密码登录之前,他们不在用户服务处理的身份验证过程中.
另请注意,我无法访问用户密码,因为注册过程由多个屏幕/视图覆盖,因为在这种情况下,他们需要在注册过程中验证其电子邮件.
进展:
我找到了这个https://github.com/IdentityServer/IdentityServer3/issues/563,但还没有找到如何触发重定向.
我正在尝试使用以下方式发出身份验证令牌:
var localAuthResult = userService.AuthenticateLocalAsync(user);
Request.GetOwinContext().Authentication.SignIn(new ClaimsIdentity(localAuthResult.Result.User.Claims, Thinktecture.IdentityServer.Core.Constants.PrimaryAuthenticationType));
Run Code Online (Sandbox Code Playgroud)
但到目前为止我能做的最好的事情是将用户重定向回登录界面:
HttpCookie cookie = Request.Cookies["signin"]; // Stored previously at beginning of registration process
return Redirect("~/core/login?signin=" + cookie.Value);
Run Code Online (Sandbox Code Playgroud) 在尝试DataProtectionProvider
手动创建时,我偶然发现了 Microsoft 文档,DpapiDataProtectionProvider
其中说:
用于提供派生自数据保护 API 的数据保护服务。当您的应用程序不是由 ASP.NET 托管并且所有进程都以相同的域标识运行时,它是数据保护的最佳选择。
突然出现一个问题:当您的应用程序由 ASP.NET 托管时,最佳选择是什么?
进一步搜索,似乎最好的选择是DataProtectionProvider
从 OWIN获取。这可以在启动配置中完成,您可以在命名空间中IAppBuilder
使用和使用AppBuilderExtensions
,Microsoft.Owin.Security.DataProtection
您可以调用app.GetDataProtectionProvider()
.
到目前为止,我很满意。但是,现在您想将 注入到DataProtectionProvider
您的类的构造函数中(例如 a UserManager
)。我看到了一个建议,你将它存储DataProtectionProvider
在一个静态属性中,然后在你需要的地方使用它,但这似乎是一个相当错误的解决方案。
我认为类似于以下代码段的解决方案是合适的(使用 ninject 容器):
kernel.Bind<IDataProtectionProvider>()
// beware, method .GetDataProtectionProvider() is fictional
.ToMethod(c => HttpContext.Current.GetOwinContext().GetDataProtectionProvider())
.InRequestScope();
Run Code Online (Sandbox Code Playgroud)