我有一些应用程序和身份服务器正常工作。 我的几个旧应用程序仍在使用基于表单的身份验证,为了实现SSO,我在web.config中使用了机器密钥和域组合。
<authentication mode="Forms">
<forms name="SSO"
loginUrl="http://site1.example.com/login.aspx"
defaultUrl="http://example.com"
domain="example.com" slidingExpiration="true">
</forms>
</authentication>
<machineKey validationKey="35D679385CE8" decryptionKey="55D456A"
validation="HMACSHA256" decryption="AES" />
它帮助我实现SSO。
现在问题是在从webforms应用程序进行身份验证后,如果用户导航到我的任何新应用程序,他们会被重定向到身份以进行登录。 我想要的是,如果FormsAuthentication cookie可用,身份服务器会以任何方式验证用户身份。 现在不可能改变我的旧应用程序。
答案 0 :(得分:0)
首先,请参阅我之前的问题/答案,以利用Owin中的FormsAuth票证:OWIN Self-Host CookieAuthentication & Legacy .NET 4.0 Application / FormsAuthenticationTicket
一旦您能够解密/加密FormsAuth cookie,您就可以在IdentityServer中利用它。
由于您的托管很可能与我的不同,因此请将其作为参考:
/
- &gt;我们的主要api appBuilder
/auth
- &gt;我们的identityServer
我们的主API appBuilder使用cookie auth中间件,如上面关联的SO帖子(链接)中所述。
IdenityServer app组合root:
appBuilder.Map("/auth", idsrvApp =>
{
idsrvApp.Use((context, task) =>
{
// since we can authenticate using "Cookies" auth,
// we must add the principal to the env so we can reuse it in the UserService
// oddly, the Context.Authentication.User will clear by the time it gets there and we can't rely on it
// my best guess is because IdentityServer is not authenticated (no cookie set)
if (context.Authentication.User != null && context.Authentication.User.Identity.IsAuthenticated)
context.Environment.Add("auth.principal", context.Authentication.User);
return task.Invoke();
});
idsrvApp.UseIdentityServer(isOptions);
});
UserService.cs
public async Task PreAuthenticateAsync(PreAuthenticationContext context)
{
// if we already have an authenticated user/principal then bypass local authentication
if (_Context.Authentication.User.Identity.IsAuthenticated ||
_Context.Environment.ContainsKey("auth.principal"))
{
var principal = _Context.Authentication.User.Identity.IsAuthenticated
? _Context.Authentication.User
: (ClaimsPrincipal)_Context.Environment["auth.principal"];
context.AuthenticateResult =
new AuthenticateResult(); // set AuthenticateResult
return;
}
}
请注意: