Контекст Owin в модели ASP MVC или хранилище
Я пытаюсь использовать Оуэна без идентичности. В процессе входа в систему я добавляю претензии примерно так:
[HttpPost]
[AllowAnonymous]
public ActionResult Login(Domain.Model.User.User model, string returnUrl)
{
var response = someFunctionCall();
AuthData data = response.authdata;
IEnumerable<Claim> claim = new List<Claim>(){
new Claim(ClaimTypes.CookiePath, MvcApplication.ApplicationPath),
new Claim(ClaimTypes.Name, model.UserId),
new Claim(Constants.ClaimsConstants.1customClaim, data.1customClaim),
new Claim(Constants.ClaimsConstants.2customClaim, data.2customClaim)
};
ClaimsIdentity id = new ClaimsIdentity(claim, CookieAuthenticationDefaults.AuthenticationType);
HttpContext.GetOwinContext().Authentication.SignIn(new AuthenticationProperties() { IsPersistent = true }, id);
return RedirectToAction("Index", "Home");
}
В моем классе запуска я устанавливаю в своем OnResponseSigned в провайдере, я устанавливаю Thread.CurrentPrinipal Context.OwinContext.Authentcation как IPrincipal. Вот так:
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieSecure = CookieSecureOption.Always,
LoginPath = new PathString("/Account/Login"),
AuthenticationMode = AuthenticationMode.Active,
Provider = new CookieAuthenticationProvider
{
OnResponseSignedIn = (context =>
{
OnSignedInResponse(context);
})
)}
}
private void OnSignedInResponse(CookieResponseSignedInContext context)
{
Thread.CurrentPrincipal = context.OwinContext.Authentication as IPrincipal;
}
позже в приложении мне нужно получить доступ к претензиям, но я не могу этого сделать.
private static readonly ClaimsPrincipal user = Thread.CurrentPrincipal as ClaimsPrincipal;
private static readonly IEnumerable<Claim> claims = user.Claims;
public static CustomUserInfo Idenitiy
{
get
{
UserInfo user = new UserInfo()
{
Custom1 = claims.Where(c => c.Type == Constants.ClaimsConstants.1customClaim).First().Value,
Custom2 = claims.Where(c => c.Type == Constants.ClaimsConstants.2customClaim).First().Value
};
return user;
}
}
Не уверен, должен ли я использовать контекст Owin или я могу использовать контекст Thread.current. Когда я проверяю Thread.CurrentPrincipal, он, кажется, там просто не в претензиях. Какие-нибудь мысли?
1 ответ
Это обходной путь, но чтобы исправить это, я пошел и получил контекст owin вместо использования Thread.CurrentPrincipal. Вот так:
private static readonly ClaimsPrincipal user = System.Web.HttpContext.Current.GetOwinContext().Authentication.User as ClaimsPrincipal;
private static readonly IEnumerable<Claim> claims = user.Claims;
public static CustomUserInfo Idenitiy
{
get
{
UserInfo user = new UserInfo()
{
Custom1 = claims.Where(c => c.Type == Constants.ClaimsConstants.1customClaim).First().Value,
Custom2 = claims.Where(c => c.Type == Constants.ClaimsConstants.2customClaim).First().Value
};
return user;
}
}
Все еще не уверен, почему Thread.CurrentPrincipal не работает.