2017-02-17 37 views
0

我试着在没有标识的情况下使用Owin。在我的处理签到我加入索赔,像这样:在MVC模型或知识库中的Owin上下文

[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时,它似乎只是没有在索赔中。有什么想法吗?

回答

0

这是一个工作,但要解决这个问题,我去了,并得到了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不起作用。