我正在使用ASP.NET身份與ClaimsIdentity
來驗證我的用戶身份。當用戶通過身份驗證時,屬性User.Identity
包含一個ClaimsIdentity
實例。未在登錄請求中設置ASP.NET身份
然而,這還不是登錄請求期間的情況:
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, false, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
var identity = User.Identity;
------------> // identity is of type WindowsIdentity <------------
return RedirectToLocal(returnUrl);
正如你可以看到,即使登錄成功,物業User.Identity
尚未設置爲ClaimsIdentity
實例。我認爲這是有道理的,這意味着SignInManager
不會更新該屬性,所以我們必須等到下一個請求才能看到登錄結果。
不過,我有方法PasswordSignInAsync
後做額外的邏輯,所以我需要一種方式來獲得的ClaimsIdentity
比如在switch語句的.Success分支。
在考察在調試器中SignInManager
,我一看,原來是Microsoft.Owin.Security.AuthenticationManager
類型,其具有包含我正在尋找的ClaimsIdentity
財產SignInEntry.Item1
的。
但是,類型Microsoft.Owin.Security.AuthenticationManager
不公開,所以唯一的方法似乎是使用反射的黑客。
有沒有更好的方法?
使用'RedirectToAction'並獲取該操作中的身份?不要返回一個URL,而是返回要重定向到的視圖的名稱。 – 2015-03-03 13:02:44
這是我目前使用的解決方法。但是在登錄操作中不可能獲得'ClaimsIdentity'? – cheeesus 2015-03-03 13:41:16
[顯然不是。](http://stackoverflow.com/a/26739821/3846058) – 2015-03-03 13:45:05