2014-10-27 58 views
2

我正在開發一個使用ASP.NET Web API的Web服務。我正在使用ASP.NET身份驗證和令牌生成。我需要在令牌響應json中返回一個擴展屬性。直到現在我能夠返回一個擴展的字符串屬性,我在其中發送一個通過將自定義類對象序列化爲json而獲得的json字符串。以下是我的身份驗證提供程序代碼:Web API認證響應屬性

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     await Task.Run(() => 
     { 
      context.Validated(); 
     });    
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     await Task.Run(() => 
     { 
      var loginResponse = new AccountManager().Login(context.UserName, context.Password); 

      if (loginResponse == null) 
      { 
       context.SetError("invalid_grant", Resources.Messages.InvalidGrant); 
       return; 
      } 

      var identity = new ClaimsIdentity(context.Options.AuthenticationType); 

      IDictionary<string, string> data = new Dictionary<string, string> 
      { 
       { "userData", JsonConvert.SerializeObject(loginResponse) } 
      }; 
      AuthenticationProperties properties = new AuthenticationProperties(data); 

      Microsoft.Owin.Security.AuthenticationTicket ticket = new Microsoft.Owin.Security.AuthenticationTicket(identity, properties); 
      context.Validated(ticket); 
     });    
    } 

    public override Task TokenEndpoint(OAuthTokenEndpointContext context) 
    { 
     foreach (KeyValuePair<string, string> property in context.Properties.Dictionary) 
     { 
      context.AdditionalResponseParameters.Add(property.Key, property.Value); 
     } 

     return Task.FromResult<object>(null); 
    } 
} 

現在在我的回覆中,我有一個屬性,例如"userData" : "<Json String>"而我想分配一個json對象(不是json字符串)到userData。可能嗎?

+1

試圖準確理解你在做什麼,是否有一個原因,你不能只是建立你的對象,因爲你喜歡它,然後只是使用stringify方法將其轉換爲JSON字符串? – Pseudonym 2014-10-27 13:25:48

回答

1

我不建議在票據屬性中放置JSON對象,這會增加令牌大小大的時間,並且您將在每個請求中傳輸此令牌。 如果您在獲取訪問令牌後定義受保護的獨立端點以執行此任務,那麼可能會更好。成功登錄後,您將發出額外的獲取請求,但您將保持令牌大小最小。

+0

只是想確認一件事,那就是在身份中添加聲明有什麼用處?例如identity.AddClaim(new Claim(「sub」,context.UserName)); – Haider 2014-10-28 10:09:45

+2

在AuthenticationProperties中添加JSON對象時,不會增加標記的大小,但只需將其他屬性添加到響應對象。令牌只包含聲明,而不包含屬性。所以不,你不要在每個請求中提交屬性,這樣做是完美的。 – emp 2016-06-24 08:17:29