SignInAsAuthenticationType允许我获取OAuth令牌而不会覆盖现有声明吗?

goo*_*ate 15 c# oauth asp.net-web-api owin asp.net-identity-3

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

我的目标是预防

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

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

  2. SignInAsAuthenticationType能解决我的需求吗?

  3. 如果没有,何时使用?

使用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"
});
Run Code Online (Sandbox Code Playgroud)

Tra*_*her 3

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

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

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