2017-02-17 4 views
0

ID없이 Owin을 사용하려고합니다. 과정에서 내 로그인 그래서 같은 문구를 추가하고 :ASP에서의 Owin 컨텍스트 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"); 
} 

을 내 시작 클래스에서 나는 나의 제공에 내가 IPrincipal로 Thread.CurrentPrinipal Context.OwinContext.Authentcation을 설정하고 OnResponseSigned으로 설정하고있다. 이와 같이 :

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; 
    } 

나중에 응용 프로그램에서 나는 acccess를 얻을 필요가 있지만 그렇게 할 수는 없습니다.

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을 검사 할 때 클레임에없는 것 같습니다. 이견있는 사람?

답변

0

이 문제는 해결되었지만 Thread.CurrentPrincipal을 사용하는 대신 owin 컨텍스트를 얻었습니다. 좋아요 :

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이 작동하지 않는 이유는 아직 확실하지 않습니다.