SignInAsAuthenticationType 是不是允许我在不覆盖现有声明的情况下获取 OAuth 令牌?

Posted

技术标签:

【中文标题】SignInAsAuthenticationType 是不是允许我在不覆盖现有声明的情况下获取 OAuth 令牌?【英文标题】:Does SignInAsAuthenticationType allow me to get an OAuth token without overwriting existing claims?SignInAsAuthenticationType 是否允许我在不覆盖现有声明的情况下获取 OAuth 令牌? 【发布时间】:2017-06-12 15:54:05 【问题描述】:

我需要用户使用 Facebook 的开箱即用身份验证登录网站。我现在需要链接到 Google(和其他服务)中的用户驱动器。我想使用 ASP.Net Identity OAuth 身份提供程序来处理令牌交换,但我不希望它触及现有的 UserCredential 或将其用于SignInUserPrincipal

我的目标是防止

AuthenticateCoreAsync 从返回 AuthenticationTicket 导致修改当前登录的用户身份 用户使用从 Google 获得的声明来简化身份验证系统。 (我应该已经让用户通过其他方式登录) 防止意外的令牌/cookie 被用于创建有效会话,从而创建权限提升场景?

问题

    设置自定义grantIdentity 对IOwinContext.Authentication.SignIn() 有什么影响?

    SignInAsAuthenticationType 能解决我的需求吗?

    如果没有,什么时候使用?

使用 Google 提供程序的理论代码

// The cookie needs to be First in the chain.
app.UseCookieAuthentication(new CookieAuthenticationOptions

    AuthenticationType = "CustomExternal",
    AuthenticationMode = AuthenticationMode.Passive,
    CookieName = "MyAwesomeCookie",
    ExpireTimeSpan = TimeSpan.FromMinutes(5),
    //Additional custom cookie options....
);

//Note that SignInAsAuthenticationType == AuthenticationType
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions

    AuthenticationType = "GoogleBackOffice",
    ClientId = "abcdef...",
    ClientSecret = "zyxwv....",
    SignInAsAuthenticationType = "CustomExternal"
);

【问题讨论】:

澄清一下,你想通过他们的 Facebook 身份登录用户,然后你想添加其他身份,比如谷歌,这样你就可以访问他们的资源,但你不希望用户成为能够通过其他提供商(例如 Google)登录到您的网站吗? @Tratcher 完全正确。尽管我使用 Facebook 身份作为“核心 ID”,但实际上我将创建自己的身份中间件作为现有 OpenIDConnect 中间件的分支。 (参考Katana源码) 另见添加多种身份验证类型的能力...可能与***.com/q/41985478/328397有关 【参考方案1】:

Visual Studio 2015 MVC 个人用户帐户模板执行类似的操作。您创建您的第一个帐户(使用本地用户名和密码或远程提供商),然后您可以将其他身份链接到该帐户。它通过在登录期间维护两个 cookie 来实现此链接,一个用于应用程序,一个用于外部身份。

如果您查看 LinkLoginCallback 下的 ManageController,您应该能够调整该点的逻辑以存储外部身份令牌,但不授予它对您的应用程序的登录访问权限。

换句话说,这样的逻辑应该在控制器逻辑中的授权层进行管理,而不是在 auth 中间件的身份验证层。

【讨论】:

明白,但是请求登录的 OpenID Connect 代码并内置了 CSRF 保护,在调用 SignIn 时会自动创建一个 ASP.NET 身份。我不希望调用任何登录。据我所知,SignInAsAuthenticationType 允许这样做(无需调整逻辑),但我想确保我正确实现它。 docs.microsoft.com/en-us/aspnet/core/security/authentication/… 次要 cookie 的登录有什么问题?只要不是您的应用 cookie,就不会用于授权。 我不太确定。我确实想防止将不相关的谷歌用户 Mallory 添加到 Alice 或 Bob 的常规 Facebook 帐户的情况......以及其他威胁【参考方案2】:

如果 ClaimsPrincipal.Identity.IsAuthenticated 为 false,则用户将面临登录页面的挑战。

【讨论】:

以上是关于SignInAsAuthenticationType 是不是允许我在不覆盖现有声明的情况下获取 OAuth 令牌?的主要内容,如果未能解决你的问题,请参考以下文章