簡體   English   中英

如何重定向和自動登錄用戶

[英]How to redirect and auto login user

如何將用戶從一個Asp.net Mvc站點重定向到另一個Asp.net MVC站點並自動登錄?

情況是,我們將有一些客戶需要去一個站點,而有些則需要去另一個站點。 我被要求這樣做,以便當客戶被重定向到正確的站點時,他們也自動登錄到他們被重定向到的站點。

假設您不想集成現有的單點登錄解決方案,並且要對兩個站點都使用表單身份驗證,並且這些站點不在同一域中。 MVC中的表單身份驗證是通過Cookie完成的。 因此,任務是當您登錄到Site1以便在Site2上創建身份驗證cookie時。

通常,您向Site2發出請求,例如:

/Impersonate/Start?encryptedToken=some_encrypted_stuff

Site2的處理方式如下:

[DataContract]
public class Token
{
  [DataMember(Name = "u")]
  public string UserName { get; set; }
  [DataMember(Name = "t")]
  public DateTime TimeStamp { get; set; }
  [DataMember(Name = "m")]
  public string Magic { get; set; }
  public Token()
  {
    Magic = MAGIC;
    TimeStamp = DateTime.Now;
  }
  public const string MAGIC = "SOME_RANDOM_STRING";
}

public class ImpersonateController : Controller
{
  [HttpGet]
  public ActionResult Start(string encryptedToken)
  {
    // symmetric encryption - hopefully you know how to do it :)
    string decryptedToken = Decrypt(encryptedToken);
    var serializer = new DataContractJsonSerializer(typeof(Token));
    Token token;
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(decryptedToken)))
    {
      token = serializer.ReadObject(stream);
    }
    if (!string.Equals(token.Magic, Token.MAGIC) || 
      (DateTime.Now - token.TimeStap).TotalMinutes > 1))
    {
      // magic doesn't match or timestamp is too old
      throw new Exception("Invalid token.");
    }
    FormsAuthentication.SetAuthCookie(token.UserName, true);
    return new HttpStatusCodeResult(HttpStatusCode.OK); 
  }
}

也許不用說/ Impersonate / Start應該在https下。 至於制作請求-您可以將其直接放入視圖並通過json發出請求。

在Site1中:

public class LoginController : Controller
{
  public ActionResult Login(string userName, string password)
  {
     // ... validate user logs to site 1 etc
     var site2UserName = userName;
     var token = new Token { UserName = site2UserName };
     var serializer = new DataContractJsonSerializer(typeof(Token));
     string decryptedToken;
     using (var stream = new MemoryStream())
     {
       serializer.WriteObject(stream, token);
       decryptedToken = Encoding.UTF8.GetString(stream.ToArray());
     }
     // symmetrical encryption
     return new View(new LoginMode { Token = HttpUtility.UrlEncode(Encrypt(decryptedToken)) });
  }
}

查看(假設您有jQuery)

$(function() {    
  $.get("https://site2.com/Impersonate/Start?token=@Html.Raw(Model.Token)");
});

因此,在登錄到Site1之后,您將提供使用AJAX將請求發送到Site2的視圖,該視圖還將在此對用戶進行身份驗證。 通常最好是應要求進行操作-Site2的表單身份驗證cookie最終將過期。 所以我希望在Site1上像這樣:

<a href="/Login/StartImpersonation">Continue to site 2</a>

[HttpGet]
[Authorize]
public ActionResult StartImpersonation()
{
  // this is essentially similar to Login action 
  string encryptedToken = "";
  string redirectUrl = string.Format(CultureInfo.InvariantCulture,
    "https://site2.com/Impersonate/Start?encryptedToken={0}",
    HttpUtility.UrlEncode(encryptedToken));
  return Redirect(redirectUrl);
}

這樣做會更好,因為a)Site2上的cookie不會過期b)如果模擬用戶出錯,用戶將看到原因(如果AJAX模擬用戶出錯,則可以向用戶顯示一些錯誤,但是看起來很奇怪-身份驗證)到站點2的操作未成功-為什么他們要在此對我進行身份驗證?:)。

您需要單點登錄(SSO)解決方案。 這可以通過許多方式來完成。 OpenID很受歡迎: https : //en.wikipedia.org/wiki/OpenID這是一個稍舊的方法的許多細節: http : //www.codeproject.com/Articles/114484/Single-Sign-On-SSO -for-cross-domain-ASP-NET-appl這里還有更多內容: C#ASP.NET單一登錄實現

高溫超導

在將某人從一個站點轉移到另一個站點的鏈接上,以下是一些您可以在JS中放入的內容,可以滿足您的需要:

  1. 單擊鏈接后,將完成$.get來獲取登錄頁面的HTML。
  2. 然后將用於確保第二個站點安全的用戶的登錄名和密碼放入JS變量中。
  3. 通過$.ajax請求發布數據,以便該人員在后台通過JS登錄。
  4. 現在,您可以在當前窗口中重定向,也可以使用其他站點的主頁打開新窗口,並且可以登錄到他們的站點,而無需另外進行其他操作。

請注意,如果您想使轉換更容易(如加載帶有鏈接的頁面時),則可以更早地完成某些操作,而當文檔准備就緒時,可以在JS中完成。 這里的關鍵點是完成第二個站點上的身份驗證所需的cookie,而無需用戶進行任何額外的單擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM