如何在Umbraco中将外部OAuth标识转换为本地标识?

时间:2016-12-21 15:57:36

标签: oauth umbraco owin katana

我正在尝试使用我公司的网站开发一个概念验证,作为OAuth授权服务器,由Umbraco通过OWIN / Katana使用。所有的OAuth管道似乎都运行得很好,但Umbraco并没有将外部身份转换为本地身份。用户不再登录Umbraco后端,而是返回登录页面。 OAuth流程完成后唯一的变化是Umbraco创建了一个包含长加密字符串的UMB_EXTLOGIN cookie。

如果我直接使用本地身份登录(即Umbraco后端登录页面上的用户名和密码),Umbraco会创建4个cookie:UMB_UCONTEXT,UMB_UPDCHK,XSRF-TOKEN和XSRF-V。我假设我错过了将外部身份转换为本地身份的内容,但我不确定那是什么。

Startup.Auth.cs

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        app.ConfigureBackOfficeMyCompanyAuth(Properties.Settings.Default.ClientId, Properties.Settings.Default.ClientSecret);
    }
}

UmbracoMyCompanyAuthExtensions.cs

public static class UmbracoMyCompanyAuthExtensions
{
    public static void ConfigureBackOfficeMyCompanyAuth(this IAppBuilder app, string clientId, string clientSecret,
        string caption = "My Company", string style = "btn-mycompany", string icon = "fa-rebel")
    {
        var options = new MyCompanyAuthenticationOptions
        {
            ClientId = clientId,
            ClientSecret = clientSecret,
            SignInAsAuthenticationType = Constants.Security.BackOfficeExternalAuthenticationType,
            Provider = new MyCompanyAuthenticationProvider(),
            CallbackPath = new PathString("/MyCompanySignIn")
        };

        options.ForUmbracoBackOffice(style, icon);
        options.Caption = caption;
        app.UseMyCompanyAuthentication(options);
    }
}

MyCompanyAuthenticationExtension.cs

public static class MyCompanyAuthenticationExtensions
{
    public static IAppBuilder UseMyCompanyAuthentication(this IAppBuilder app, MyCompanyAuthenticationOptions options)
    {
        if (app == null)
        {
            throw new ArgumentNullException("app");
        }
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }
        app.Use(typeof(MyCompanyAuthenticationMiddleware), new object[] { app, options });
        return app;
    }

    public static IAppBuilder UseMyCompanyAuthentication(this IAppBuilder app, string clientId, string clientSecret)
    {
        MyCompanyAuthenticationOptions options = new MyCompanyAuthenticationOptions
        {
            ClientId = clientId,
            ClientSecret = clientSecret
        };
        return app.UseMyCompanyAuthentication(options);
    }
}

我的AuthenticationHandler<T>.AuthenticateCoreAsync()自定义实现会返回包含以下声明和属性的AuthenticationTicket。

权利要求

  1. GivenName =我的名字
  2. FamilyName =我的姓氏
  3. 姓名=我的全名
  4. 电子邮件=我的电子邮件地址
  5. 属性

    1. .redirect = / umbraco /

2 个答案:

答案 0 :(得分:0)

没有准备好任何代码但是根据过去的经验,使用Facebook OAuth,您必须将自己的逻辑基本连接到其中一个或两个,将OAuth对象(用户)转换为umbraco。

当我们在用户第一次这样做(通过电子邮件检查)之前完成它时,它会创建一个新用户,然后每次后续登录都会通过他们的电子邮件获取umbraco用户并将其登录到代码中。对于后端用户和前端成员来说,情况都是一样的。

答案 1 :(得分:0)

因此,经过多轮车轮转动,我终于明白了。由此产生的ClaimsIdentity不包含NameIdentifier声明。我的OAuth中间件包含使用电子邮件地址作为值的声明,它开始工作。

仅供参考,如果您希望在外部登录时自动链接外部和本地帐户,here这是一个非常好的示例,对我有用。