[英]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中放入的內容,可以滿足您的需要:
$.get
來獲取登錄頁面的HTML。 $.ajax
請求發布數據,以便該人員在后台通過JS登錄。 請注意,如果您想使轉換更容易(如加載帶有鏈接的頁面時),則可以更早地完成某些操作,而當文檔准備就緒時,可以在JS中完成。 這里的關鍵點是完成第二個站點上的身份驗證所需的cookie,而無需用戶進行任何額外的單擊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.