Azure移动应用程序 - 向JSON Web令牌添加自定义声明

时间:2016-10-09 23:24:34

标签: asp.net jwt azure-mobile-services

在我的移动应用程序中,我需要使用类似的信息向JSON Web令牌添加“自定义”信息

  

HEADER:ALGORITHM&令牌类型

     

{“typ”:“JWT”,“alg”:“HS256”} PAYLOAD:DATA

     

{“sub”:“”,“FahrerBez”:“Tab 2A7-20F”,“FahrerName”:   “Tab EB”,“FahrerVorname”:“Erich”,“FahrerHandyNr”:“”,
  “FahrerId”:“5456034A4”,“SprachId”:“1”,“TruckFirmaName”:“”,“ver”:“3”,“iss”:“https://”my   app“.azurewebsites.net /”,“aud”:“https://”我的   app“.azurewebsites.net /”,“exp”:1478547855,“nbf”:1475955855}

关注这本书:Adrian Halls Azure Mobile Apps Book

我实现了我的CustAuthController:

[HttpPost]
public IHttpActionResult Post([FromBody] JObject assertion)
{
var imei = assertion["imei"]?.ToString();

if (!IsValidInternationalMobileEquipmentId(imei))
{
    return Unauthorized();
}

var truckFahrer = _rcsMobileContext.TruckFahrers.FirstOrDefault(truckfahrer => truckfahrer.IMEI == imei);

var claims = new Claim[]
{
    new Claim(JwtRegisteredClaimNames.Sub, imei),
    new Claim(TruckFahrer.FahrerBezKey, truckFahrer?.FahrerBez ?? string.Empty),
    new Claim(TruckFahrer.FahrerNameKey, truckFahrer?.FahrerName ?? string.Empty), 
    new Claim(TruckFahrer.FahrerVornameKey, truckFahrer?.FahrerVorname ?? string.Empty),
    new Claim(TruckFahrer.FahrerHandyNrKey, truckFahrer?.FahrerHandyNr ?? string.Empty),   
    new Claim(TruckFahrer.FahrerIdKey, truckFahrer?.FahrerId.ToString()),
    new Claim(TruckFahrer.SprachIdKey, truckFahrer?.SprachId.ToString()),
    new Claim(TruckFahrer.TruckFirmaNameKey, truckFahrer?.TruckFirmaName ?? string.Empty)
};

// see: https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter2/debugging/
if (!string.IsNullOrWhiteSpace(Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings().HostName))
{
    // In Azure Portal HostName is not null
    _signingKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY");
    var website = Environment.GetEnvironmentVariable("WEBSITE_HOSTNAME");
    _audience = $"https://{website}/";
    _issuer = $"https://{website}/";
}
else
{
    // on IIS local debugging HostName is null. Make sure HostName is not set in Web.config
    _signingKey = Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings()["SigningKey"];
    _audience = Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings()["ValidAudience"];
    _issuer = Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings()["ValidIssuer"];
}

JwtSecurityToken token = AppServiceLoginHandler.CreateToken(
    claims, _signingKey, _audience, _issuer, TimeSpan.FromDays(30));

return Ok(new LoginResult()
{
    AuthenticationToken = token.RawData,
    User = new LoginResultUser {UserId = imei}
});

}

在这里,我添加了“自定义”声明信息。现在在移动应用程序后端我检索它:

public class TruckAuftragController : TableController<TruckAuftrag>
{
private readonly TruckFahrerInfo _truckFahrerInfo;

public TruckAuftragController()
{
    _truckFahrerInfo = new TruckFahrerInfo(this.User as ClaimsPrincipal);
}

 . . .



public class TruckFahrerInfo
{
 private readonly ClaimsPrincipal _truckFahrerClaimsPrincipal; 

public TruckFahrerInfo(ClaimsPrincipal truckFahrerClaimsPrincipal)
{
    _truckFahrerClaimsPrincipal = truckFahrerClaimsPrincipal;
}
public string UserId => _truckFahrerClaimsPrincipal?.FindFirst(ClaimTypes.NameIdentifier).Value;

public int FahrerId
{
    get
    {
        var fahrerIdString = _truckFahrerClaimsPrincipal?.FindFirst(TruckFahrer.FahrerIdKey).Value;

        int fahrerId = 0;

        if (!int.TryParse(fahrerIdString, out fahrerId))
        {
            System.Diagnostics.Debug.WriteLine($"FahrerId invalid. FahrerId = {fahrerIdString}");
        }

        return fahrerId;
    }
}
}
}

我的问题:这是将这些信息添加到JWT的好方法吗?我对这项技术很陌生,不确定我是否做得对。

感谢您的任何建议

埃里克

1 个答案:

答案 0 :(得分:0)

这似乎是利用其他声明的好方法。为了清楚起见,我将在本书中添加一部分内容。