如何解决如何向使用Azure功能登录的特定用户发送信号r消息?
嗨,我正在使用天蓝色函数和天蓝色信号r。我有带有Azure广告身份验证的前端应用程序。我想通过azure函数将信号r通知发送给特定用户。下面是我的反应代码。
constructor(props: IMapUpload) {
super(props);
this.fileUploaderRef = React.createRef<FileUploader>();
this.hubConnection = new signalR.HubConnectionBuilder().withUrl("http://localhost:7071/api")
.configureLogging(signalR.LogLevel.Information)
.build();// https://wadevdvlgenseawe02-webapi.azurewebsites.net/MapUpload
this.hubConnection.start().catch((err: string) => console.log(err));
}
componentDidMount() {
this.hubConnection.on("newMessage",(message: string) => {
console.log(message);
//Pass the Map File Url to Site Details
this.props.onMapFileUpload(message);
this.handleProgress(message);
});
const sarId= this.props.sarId;
this.props.sar?.getMapFileDetails(sarId,null,null);
}
下面是我的天蓝色函数
[FunctionName("Negotiate")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous,"post",Route = "negotiate")] HttpRequest req,IBinder binder)
{
if (req.Headers.ContainsKey("Authorization"))
{
var principal = TryGetPrincipal(req.Headers["Authorization"].ToString());
if (principal != null)
{
var connectionInfo = await binder.BindAsync<SignalRConnectionInfo>(new SignalRConnectionInfoAttribute
{
HubName = "MapUpload",UserId = principal.FindFirst(ClaimTypes.NameIdentifier).Value
});
return new OkObjectResult(connectionInfo);
}
}
return new UnauthorizedResult();
}
public static ClaimsPrincipal TryGetPrincipal(string jwtToken)
{
IdentityModelEventSource.ShowPII = true;
SecurityToken validatedToken;
TokenValidationParameters validationParameters = new TokenValidationParameters();
validationParameters.ValidateLifetime = true;
validationParameters.ValidAudience = "e51c317b-87e7-4cb3-95f0-37cb52b6f873";
// validationParameters.ValidIssuer = _issuer.ToLower();
validationParameters.IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes(".Kmt.LP_f2D3.E8MY.TXyve.-sgr6770j_"));
ClaimsPrincipal principal = new JwtSecurityTokenHandler().ValidateToken(jwtToken,validationParameters,out validatedToken);
return principal;
}
[FunctionName("Negotiate")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous,UserId = principal.FindFirst(ClaimTypes.NameIdentifier).Value
});
return new OkObjectResult(connectionInfo);
}
}
return new UnauthorizedResult();
}
public static ClaimsPrincipal TryGetPrincipal(string jwtToken)
{
IdentityModelEventSource.ShowPII = true;
SecurityToken validatedToken;
TokenValidationParameters validationParameters = new TokenValidationParameters();
validationParameters.ValidateLifetime = true;
validationParameters.ValidAudience = "myclientid";
// validationParameters.ValidIssuer = _issuer.ToLower();
validationParameters.IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes("mysecrete"));
ClaimsPrincipal principal = new JwtSecurityTokenHandler().ValidateToken(jwtToken,out validatedToken);
return principal;
}
[FunctionName("Function1")]
public static Task Run([ServiceBusTrigger("myqueue",Connection = "myconn")]string myQueueItem,ILogger log,[SignalR(HubName = "MapUpload")] IAsyncCollector<SignalRMessage> signalRMessages)
{
log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
return signalRMessages.AddAsync(
new SignalRMessage
{
//UserId = "test@mydomain.com",Target = "newMessage",Arguments = new[] { myQueueItem }
});
}
如果我已经在前端应用程序中使用test@mydomain.com登录,那么我只想发送test@mydomain.com消息。如果添加用户ID,则消息不会传递;如果删除,则消息将传递给所有人。然后,我做了一些研究,发现我需要添加UserId = "{headers.x-ms-client-principal-id}"
,但是添加之后,我开始遇到错误了
http://localhost:7071/api/negotiate?negotiateVersion=1 500 (Internal Server Error)
Error: Failed to complete negotiation with the server: Error: Internal Server Error
我正在努力解决这个问题。有人可以帮我在这里做错什么吗?任何帮助将不胜感激。谢谢
解决方法
由于您没有使用内置的身份验证/授权功能,因此您使用的标头不适用。相反,您可以从传递的JWT令牌中提取upn
/ email
,并利用runtime binding将提取的值作为UserId
传递。
这样,您以后应该可以使用传递的UserId
向特定用户发送通知。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。