layout: docs-default
身份提供器
IdentityServer支持通過第三方身份認證器來認證,第三方認證機制必須封裝在katana認證中間件中。
katana本身帶有Google,Facebook,Twitter,Microsoft Accounts,WS-Federation和OpenID Connect認證中間件。社區(qū)也提供了一些其它認證中間件(如 Yahoo, LinkedIn, and SAML2p). 請看 完整列表.
要支持第三方登陸,項目里需要增加一個帶IAppBuilder 和 a string 參數(shù)的方法。
public static void ConfigureIdentityProviders(IAppBuilder app, string signInAsType)
{
var google = new GoogleOAuth2AuthenticationOptions
{
AuthenticationType = "Google",
Caption = "Google",
SignInAsAuthenticationType = signInAsType,
ClientId = "...",
ClientSecret = "..."
};
app.UseGoogleAuthentication(google);
var fb = new FacebookAuthenticationOptions
{
AuthenticationType = "Facebook",
Caption = "Facebook",
SignInAsAuthenticationType = signInAsType,
AppId = "...",
AppSecret = "..."
};
app.UseFacebookAuthentication(fb);
var twitter = new TwitterAuthenticationOptions
{
AuthenticationType = "Twitter",
Caption = "Twitter",
SignInAsAuthenticationType = signInAsType,
ConsumerKey = "...",
ConsumerSecret = "..."
};
app.UseTwitterAuthentication(twitter);
}
解釋
-
AuthenticationType必須是第三方登錄器的唯一標識,這個值會保存在令牌的idp聲明中。而且在認證授權的過程中,同樣的值會用于身份提供器的預選擇中,這個值會存在于acr_values參數(shù)里 (詳細信息,請看 this ). 在客戶端配置中,也會使用這個值來限制客戶端中允許的第三方登陸。 -
Caption用于在登陸界面顯示第三方登陸名字。如果Caption是空的,這個第三方登陸不會出現(xiàn)在登陸頁面。但是可以通過登陸提示使用。 -
SignInAsAuthenticationType必須填上我們傳入的參數(shù)signInAsType
必須把這個方法傳遞給AuthenticationOptions的IdentityProviders屬性里。
var idsrvOptions = new IdentityServerOptions
{
SiteName = "IdentityServer3",
Factory = factory,
SigningCertificate = Cert.Load(),
AuthenticationOptions = new AuthenticationOptions
{
IdentityProviders = ConfigureIdentityProviders
}
};
app.UseIdentityServer(idsrvOptions);
添加WS-Federation 第三方登陸
基于WS-Federation的第三方登陸可以和上面一樣的方式配置。
出于向后兼容的原因,WS-Federation中間件會監(jiān)聽所有的請求并檢查她們帶有的token數(shù)據(jù)。如果有多于一個WS-Federation中間件,就需要顯示設置一個唯一的CallbackPath屬性,這個屬性需要匹配IdP里的返回URL的。注意CallbackPath必須是相對于根目錄,不是相對于Identity Server模塊的目錄。比如:第三方登陸配置post auth tokens 到 http://mydomain.com/SubFolder/IdSrv/MyExternalProvider, 然后 CallbackPath 應該配置為 /SubFolder/IdSrv/MyExternalProvider.
var adfs = new WsFederationAuthenticationOptions
{
AuthenticationType = "adfs",
Caption = "ADFS",
SignInAsAuthenticationType = signInAsType,
MetadataAddress = "https://adfs.leastprivilege.vm/federationmetadata/2007-06/federationmetadata.xml",
Wtrealm = "urn:idsrv3"
};
app.UseWsFederationAuthentication(adfs);