SharePoint Online auth popup/jelszó nélkül

SharePoint Online auth popup/jelszó nélkül
2016-04-22T09:06:53+02:00
2016-04-22T09:06:55+02:00
2022-12-03T14:20:39+01:00
xendoli
Sziasztok!

Az alábbi problémára keresek megoldást.

SharePoint Online-ról akarnánk állományokat letölteni.
Ez jelen pillanatban a kiválasztott autentikációval megpróbálja WebClient.DownloadFile segítségével letölteni a kiválasztott fájlt. A WebClient kap ugye egy Credential-t, ahol SharePoint Online esetén (Azure AD) átadjuk a felhasználónév/jelszó kombóval lekért FedAuth és rAurh cookiekat. A CookieContainer-nek.

Nekünk azonban olyan autentikációra lenne szükségünk, ahol nem kell jelszót átadni.
Az ok egyszerű. Ahol ezt használnák Smart Card- van. Nem tudnak felhasználónév/jelszó kombót. Van egy pin kód, amit beütnek és mindenhova autentikálva vannak. Épp ezért mi sem kérhetjük ezt be tőlük. 

Adott egy termék, amihez API-n keresztül hozzáférünk.
Ennek van egy vastag és egy vékony kliens változata. A vékony kliens háttér kódja egy szerveren fut.
Vastag kliens esetén ez alapján feldobunk egy formot, ahol belép majd a response-ban kapott cookiekat eltároljuk és átadjuk a WebClient-nek. Ez működik.

A gond ott van, hogy ugyanezt vékony kliensnél is, háttérkódból is meg kellene tudnunk oldani.
Az architektúra miatt nem tudunk ablakot feldobni semmilyen formában az adott pillanatban. 

Valahogy autentikálni  kellene a  felhasználót anélkül, hogy bármilyen interakció történne a felhasználóval (Upn name vagy valami alapján).

A végeredmény az FedAuth cookie lenne, amit már át lehetne adni a Credential.CookieContainer-nek.

A kérdésem az lenne, hogy milyen autentikációval lehet ezt működésre bírni? Esetleg kell-e állítanom/telepítenem valamit ehhez SharePoint oldalon.

Minden választ előre is köszönök.

Az utolsó, amivel próbálkoztam az ez volt. Itt lehet csak a szerver beállítása vagy a rossz paraméterek miatt nem működik. 

public void GetO365BinaryTokenFromAdfs(string realm, string adfsEndPointAuthority, out string binaryToken, out DateTime expires) { expires = DateTime.MinValue; binaryToken = ""; WSTrustChannel channel = null; Uri u = new Uri(Office365Sts); var windowsBinding = new WindowsWSTrustBinding(SecurityMode.Transport); windowsBinding.TrustVersion = TrustVersion.WSTrustFeb2005; var trustChannelFactory2 = new WSTrustChannelFactory( windowsBinding, new EndpointAddress(u, EndpointIdentity.CreateUpnIdentity(adfsEndPointAuthority), new AddressHeaderCollection())); trustChannelFactory2.TrustVersion = TrustVersion.WSTrustFeb2005; trustChannelFactory2.Credentials.Windows.AllowNtlm = false; trustChannelFactory2.Credentials.SupportInteractive = false; trustChannelFactory2.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation; trustChannelFactory2.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; GenericXmlSecurityToken token; try { var rst = new RequestSecurityToken(WSTrustFeb2005Constants.RequestTypes.Issue, WSTrustFeb2005Constants.KeyTypes.Bearer); rst.AppliesTo = new EndpointAddress(realm); rst.TokenType = Microsoft.IdentityModel.Tokens.SecurityTokenTypes.Saml11TokenProfile11; channel = (Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannel)trustChannelFactory2.CreateChannel(); RequestSecurityTokenResponse rstr = null; token = channel.Issue(rst, out rstr) as GenericXmlSecurityToken; var token2 = GetO365BinaryTokenFromToken(token, new EndpointAddress(u), new EndpointAddress(u)); expires = token2.ValidTo; binaryToken = token2.TokenXml.InnerXml; } catch (WebException wex) { Trace.TraceWarning("WebException in getO365BinaryTokenFromADFS: " + wex.ToString()); throw; } catch (Exception ex) { Trace.TraceWarning("WebException in getO365BinaryTokenFromADFS: " + ex.ToString()); throw; } finally { channel?.Abort(); trustChannelFactory2.Abort(); } } public GenericXmlSecurityToken GetO365BinaryTokenFromToken(SecurityToken fromSwapnatoken, EndpointAddress issuerAddress, EndpointAddress mexAddress) { WSTrustChannel channel = null; UriBuilder u = new UriBuilder(Office365Sts); var un = new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential); var iss = new IssuedTokenWSTrustBinding(un, issuerAddress, SecurityMode.TransportWithMessageCredential, TrustVersion.WSTrustFeb2005, mexAddress) { EnableRsaProofKeys = false, KeyType = SecurityKeyType.BearerKey }; Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannelFactory trustChannelFactory2 = new Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannelFactory(iss, new EndpointAddress(u.Uri.AbsoluteUri)); trustChannelFactory2.TrustVersion = TrustVersion.WSTrustFeb2005; trustChannelFactory2.ConfigureChannelFactory(); if (trustChannelFactory2.Credentials != null) trustChannelFactory2.Credentials.SupportInteractive = false; if (trustChannelFactory2.Credentials != null) { trustChannelFactory2.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; trustChannelFactory2.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck; } GenericXmlSecurityToken token = null; try { RequestSecurityToken rst = new RequestSecurityToken(WSTrustFeb2005Constants.RequestTypes.Issue, WSTrustFeb2005Constants.KeyTypes.Bearer); rst.AppliesTo = new EndpointAddress(hostUri.GetLeftPart(UriPartial.Authority)); rst.SignatureAlgorithm = SecurityAlgorithms.RsaSha1Signature; channel = (WSTrustChannel)trustChannelFactory2.CreateChannelWithIssuedToken(fromSwapnatoken); RequestSecurityTokenResponse rstr = null; token = channel.Issue(rst, out rstr) as GenericXmlSecurityToken; } catch (Exception ex) { Trace.TraceWarning("Exception in GetO365BinaryTokenFromToken:" + ex.Message); throw; } finally { channel?.Abort(); trustChannelFactory2.Abort(); } return token; }
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd