Forguncy에서 작성한 애플리케이션에서 다른 웹 애플리케이션 및 클라우드 서비스 자격 증명을 사용하는 소위 싱글 사인온을 구현하는 경우 인증 공급자의 사용을 고려하십시오.
인증 프로바이더로 실현이 불가능한 경우, 프로그래밍에 의한 커스터마이즈에 의해 싱글 사인온이 가능합니다. 이 섹션에서는 이러한 경우에 싱글 사인온 방법을 설명합니다. 이 기능은 Windows 인증에서는 사용할 수 없습니다.
Forguncy의 인증 연계 기능은 아래 그림과 같은 흐름으로 이루어집니다.
1. 사용자 토큰을 요청합니다.
사용자의 토큰을 요청하려면 다음 사양을 충족하는 HTTP 요청을 수행합니다.
위의 메시지 본문에 포함된 비밀번호는 다른 응용 프로그램에서 로그인을 허용할 때 설정된 응용 프로그램에 공통된 암호입니다. 이 암호는 다음 위치에서 확인 및 변경할 수 있습니다.
[파일] → [옵션] → [기타 응용 프로그램과 통합]을 선택하여 [다른 응용 프로그램의 서명 허용]을 선택합니다.
다른 응용 프로그램에서 로그인 허용을 선택하지 않으면 사용자의 토큰을 요청할 수 없습니다.
2.사용자 토큰을 받습니다.
토큰을 요청하는 HTTP 요청이 성공하면 토큰이 응답으로 반환됩니다. 토큰을 요청하는 HTTP 요청이 실패하면 반환되는 토큰은 "Error:" 문자열로 시작합니다.
3.토큰을 쿼리 문자열(URL 매개 변수)로 지정하여 전환하려는 Forguncy 응용 프로그램의 페이지로 전환합니다.
http://<서버명>/<응용프로그램>/?token=1h1h1h1h-1h1h-1h1h-1h1h-1h1h1h1h1h1h
2단계에서 토큰을 받은 후 3단계를 수행할 때까지의 제한 시간은 기본적으로 10초로 설정됩니다. 이를 변경하려면 다음과 같이 하십시오.
[파일] → [옵션] → [응용 프로그램 연동]을 선택하여 [토큰 만료]를 변경합니다.
샘플코드
C#의 경우의 샘플 코드는 2개 이하에 나타냅니다.
Forguncy 애플리케이션이 HTTPS 통신 또는 기존 애플리케이션에서 신뢰할 수 있는 네트워크인 경우 이전 샘플 코드를 사용하십시오.
C#(구)
internal class Program
{
static HttpClient client = new HttpClient();
static async Task Main( string [] args)
{
var baseUrl = "http://localhost:47054/Forguncy" ;
var userName = "administrator" ;
var password = "@ddRUvpPgb^6" ;
var ssoResponse = await client.PostAsync(baseUrl + "/SSO/GetUserToken" , JsonContent.Create( new Dictionary
{
{ "userName" ,userName },
{ "password" ,password }
}));
var token = await ssoResponse.Content.ReadAsStringAsync();
if (token.StartsWith( "Error:" ))
{
Console.WriteLine(token);
return ;
}
var str = baseUrl + "?token =" + token;
}
}
C#(신규)
internal class Program
{
static HttpClient client = new HttpClient();
static async Task Main( string [] args)
{
var baseUrl = "http://localhost : 52839/Forguncy" ;
var userName = "administrator" ;
var
password = "Nk0u1w&yXqwh" ;
var publicKeyRespose = await client.PostAsync(baseUrl + "/SSO/ GetRSAPublicKey publicKey = await publicKeyRespose.Content.ReadAsStringAsync();
var encryptPassword = EncryptDataWithPemPublicKey (password, publicKey);
var ssoResponse = await client.PostAsync(baseUrl + " /SSO/ GetUser
{
{ "userName" ,userName },
{ "password" ,encryptPassword },
{ "publicKey" ,publicKey },
}));
var token = await ssoResponse.Content.ReadAsStringAsync();
if (token.StartsWith( "Error:" ))
{
Console.WriteLine(token);
return ;
}
var str = baseUrl + "?token =" + token;
}
public static string EncryptDataWithPemPublicKey( string dataToEncrypt, string pemPublicKey)
{
using RSA rsa = RSA.Create();
rsa.ImportFromPem(pemPublicKey.ToCharArray());
byte [] dataBytes = Encoding.UTF8.GetBytes(dataToEncrypt);
byte [] encryptedData = rsa.Encrypt(dataBytes, RSAEncryptionPadding.Pkcs1);
return Convert.ToBase64String(encryptedData);
}