2015-01-26 20 views
6

Ben basit rehber mvcGettingStarted izlemeye çalışıyorum. Şimdi, hem GoogleAuthentication ve FacebookAuthentication sağlayıcıları uyguladık ve her şey beklendiği gibi, aslında-giriş yapabilirsiniz ve benim kimlik sunucusu ile oturum açarsanız ben de kullanıcı başına Rol iddialarını var çalışıyor. Merak ediyorum, dış sağlayıcılardan verilen tüm iddiaları tutmak istersek? Basit örnek. Bu benim Facebook sağlayıcı kurulum nasıl gözüktüğü: Ben depolamak çalışıyorum her döngü için deThinktecture Identity Server v3 İstemciler Harici sağlayıcılardan nasıl korunur?

var facebookOptions = new FacebookAuthenticationOptions() { 
      AuthenticationType = "Facebook", 
      Caption = "Sign in with Facebook", 
      AppId = "*****", 
      AppSecret = "****", 
      SignInAsAuthenticationType = signInAsType, 
      Provider = new FacebookAuthenticationProvider() { 
       OnAuthenticated = (context) => { 

        foreach (var x in context.User) { 
         context.Identity.AddClaim(new Claim(x.Key, x.Value.ToString())); 
        } 

        return Task.FromResult(context); 
       } 
      }, 
     }; 

     facebookOptions.Scope.Add("email"); 
     facebookOptions.Scope.Add("public_profile"); 
     facebookOptions.Scope.Add("user_friends"); 

     app.UseFacebookAuthentication(facebookOptions); 

tüm Facebook Kimlik iddia, ama geri SecurityTokenValidated geri aramasında aldığımda, benim Kimlik değişmedi Onları.

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions() { 
      Authority = "https://localhost:44302/identity/", 
      ClientId = "my_client", 
      Scope = "openid profile roles email", 
      RedirectUri = "https://localhost:44302/", 
      ResponseType = "id_token token", 
      SignInAsAuthenticationType = "Cookies", 
      UseTokenLifetime = false, 
      Notifications = new OpenIdConnectAuthenticationNotifications() { 

       SecurityTokenValidated = async context => { 
        //let's clean up this identity 

        //context.AuthenticationTicket.Identity doesn't have the claims added in the facebook callback 
        var nid = new ClaimsIdentity(
         context.AuthenticationTicket.Identity.AuthenticationType, 
         Constants.ClaimTypes.GivenName, 
         Constants.ClaimTypes.Role); 
        ........ 

Bu iki farklı Kimliğin işlenişini yapıyorum çünkü mi? Yapmaya çalıştığım şeyi elde etmenin doğru bir yolu var mı? Teşekkür ederiz.

cevap

4

Sen özel kullanıcı servis uygulamasında bu yapardı. Varsayılan olan, dış sağlayıcıdan gelen talepleri kullanılabilir hale getirir. Özel bir kullanıcı hizmeti Dokümanlar: @ Brock-allen olarak https://identityserver.github.io/Documentation/docsv2/advanced/userService.html

+0

bağlantı sabit 404 https://identityserver.github.io/Documentation/docs/advanced/userService.html – Rahatur

+0

linke sonuçlandığını ................... –

6

kullanıcı hizmeti takip etmek doğru yolu olduğunu söyledi. yüzden gitti ve Şimdi

(benim Başlangıç ​​sınıfının içindeki Yapılandırma yöntemidir Elbette)

public class UserService { 
    private static InMemoryUserService _service = null; 
    public static InMemoryUserService Get() { 
     if(_service == null) 
      _service = new InMemoryUserService(Users.Get()); 

     return _service; 
    } 
} 

bu

public void Configuration(IAppBuilder app) { 
     AntiForgeryConfig.UniqueClaimTypeIdentifier = Constants.ClaimTypes.Subject; 
     JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>(); 

     var factory = InMemoryFactory.Create(
      users: Users.Get(), 
      clients: Clients.Get(), 
      scopes: Scopes.Get()); 
     factory.UserService = new Registration<IUserService>(resolver => UserService.Get()); 

..... 

gibi benim fabrikada benim userservice kayıtlı basit UserService uygulanan ihtiyacım olan tüm iddiaları specifing, (bu durumda facebook cinsinden) dış sağlayıcının kimlik doğrulama callback'inde iç dış kullanıcının kimliğini doğrulamak edebilirsiniz:

var facebookOptions = new FacebookAuthenticationOptions() { 
      AuthenticationType = "Facebook", 
      Caption = "Sign in with Facebook", 
      AppId = "******", 
      AppSecret = "*******", 
      SignInAsAuthenticationType = signInAsType, 
      Provider = new FacebookAuthenticationProvider() { 
       OnAuthenticated = (context) => { 

        foreach (var x in context.User) { 
         context.Identity.AddClaim(new Claim(x.Key, x.Value.ToString())); 
        } 

        ExternalIdentity identity = new ExternalIdentity() { 
         Claims = context.Identity.Claims, 
         Provider = "Facebook", 
         ProviderId = "Facebook" 
        }; 
        SignInMessage signInMessage = new SignInMessage(); 

        UserService.Get().AuthenticateExternalAsync(identity, signInMessage); 


        return Task.FromResult(context); 
       } 
      }, 
     } 

Şimdi,

List<Claim> claims = await UserService.Get().GetProfileDataAsync(User as ClaimsPrincipal) as List<Claim>; 

yapmak Ve Kullanıcı facebook kimlik doğrulama sırasında sağlanan tüm iddiasının olmadığını da görebilirsiniz. Elbette bu kod sadece test amaçlıdır, çok geliştirilebilir.

+0

Yerel ve dışsal iddiaları da anlatan bazı mücadelelerden geçiyorum. Http://stackoverflow.com/questions/28748000/confusion-over-local-authority-claims-and-external-provider-claims adresine bakın. Bu konuda herhangi bir ışık tutabilir misin? – Raj

+2

@Daniele tüm kodu gönderebilir misiniz? İlgimi çekiyor. Thx – mbrc

+1

AuthenticateExternalAsync bir uzantı yöntemi mi? Bu silahları kabul eden birini bulamadım. Burada sahip olduğum tek şey, bir ExternalAuthenticationContext'i bağımsız değişken olarak kabul ediyor ve aşırı yüklenme yok. –

İlgili konular