C# 通过调用另一个服务使用JWT
下面介绍了使用.NETWebAPI在C#中创建和使用JWT的实现。然而,我正在努力使我当前的系统适应列出的任何教程 到目前为止,我一直在将JWT令牌作为查询字符串的一部分发送,如下所示: …/api/users?jwt=aladsfjknasdfnjkladfskjlnajknjknfdsalnjksdfnjldf 我的路线是这样的:C# 通过调用另一个服务使用JWT,c#,asp.net,asp.net-web-api,owin,jwt,C#,Asp.net,Asp.net Web Api,Owin,Jwt,下面介绍了使用.NETWebAPI在C#中创建和使用JWT的实现。然而,我正在努力使我当前的系统适应列出的任何教程 到目前为止,我一直在将JWT令牌作为查询字符串的一部分发送,如下所示: …/api/users?jwt=aladsfjknasdfnjkladfskjlnajknjknfdsalnjksdfnjldf 我的路线是这样的: public async Task<IHttpActionResult> GetUsers(string jwt) { var user
public async Task<IHttpActionResult> GetUsers(string jwt)
{
var userValidationResult = await Utility.ValidateUser(jwt);
if (!userValidationResult.Validated)
{
return Unauthorized();
}
...
}
但是,我用
Authorize
属性修饰的路由似乎都没有碰到invoke方法中的任何断点。我总是拿到未经授权的401。为什么会这样?您可以在OWIN管道之上实现一个基本的中间件。简单的东西可以满足您的要求:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use(async (ctx, next) =>
{
var jwt = ctx.Request.Query.Get("jwt");
if (jwt != null)
{
var userValidationResult = await Utility.ValidateUser(jwt);
if (userValidationResult.Validated)
{
var identity = new ClaimsIdentity("jwt");
foreach(var role in userValidationResult.Roles)
identity.AddClaim(new Claim(ClaimTypes.Role, role));
identity.AddClaim(new Claim(ClaimTypes.Email, userValidationResult.Email));
//etc... add every claim
ctx.Request.User = new ClaimsPrincipal(identity);
}
}
await next.Invoke();
});
var config = new HttpConfiguration();
app.UseWebApi(config);
//etc...
}
}
这只是一个存根,您可能需要扩展代码以使其在特定环境中工作
像这样的中间件将设置Request.User
,然后其他中间件将使用它(包括Web API授权过滤器)。然后,您可以使用[Authorize()]
属性自由装饰控制器/操作
如果你需要一些更灵活的东西,那么我建议你多读一些
Brock Allen提供的这一资源也可以帮助您实现这一点:。您可以在OWIN管道之上实现一个基本的中间件。简单的东西可以满足您的要求:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use(async (ctx, next) =>
{
var jwt = ctx.Request.Query.Get("jwt");
if (jwt != null)
{
var userValidationResult = await Utility.ValidateUser(jwt);
if (userValidationResult.Validated)
{
var identity = new ClaimsIdentity("jwt");
foreach(var role in userValidationResult.Roles)
identity.AddClaim(new Claim(ClaimTypes.Role, role));
identity.AddClaim(new Claim(ClaimTypes.Email, userValidationResult.Email));
//etc... add every claim
ctx.Request.User = new ClaimsPrincipal(identity);
}
}
await next.Invoke();
});
var config = new HttpConfiguration();
app.UseWebApi(config);
//etc...
}
}
这只是一个存根,您可能需要扩展代码以使其在特定环境中工作
像这样的中间件将设置Request.User
,然后其他中间件将使用它(包括Web API授权过滤器)。然后,您可以使用[Authorize()]
属性自由装饰控制器/操作
如果你需要一些更灵活的东西,那么我建议你多读一些
Brock Allen提供的这个资源也可以帮助您实现这样的功能:。实现这个功能我似乎还没有控制Authorize属性,请参见问题编辑中间件本身与Authorize属性无关,应该在每个请求中调用它(无论控制器是否用
Authorize
)修饰。是否确实调用了Startup.cs
中的方法?是否在同一项目中使用了Global.asax
?另外,是否正在配置Web API?查看代码,似乎没有调用WebApiConfig.Register(配置)
Startup.cs文件中的任何位置。对于周末的响应延迟,我深表歉意。是的,我正在配置Web API,并且有一个Global.asax。我应该如何调整应用程序。在Global.asax中使用启动类的
部分?您必须放弃使用Global.asax,而只使用Startup.cs来引导应用程序。Move将所有相关代码添加到配置方法。您可以参考。实现此功能,我似乎仍然没有控制授权属性,请参阅问题编辑中间件本身与授权属性无关,应该在每次请求时调用它(无论控制器是否用Authorize
)修饰。是否确实调用了Startup.cs
中的方法?是否在同一项目中使用了Global.asax
?另外,是否正在配置Web API?查看代码,似乎没有调用WebApiConfig.Register(配置)
Startup.cs
文件中的任何位置。对于周末的响应延迟,我深表歉意。是的,我正在配置Web API,并且有一个Global.asax。我应该如何调整应用程序。在Global.asax中使用启动类的
部分?您必须放弃使用Global.asax,而只使用Startup.cs来引导应用程序。Mov将所有相关代码添加到配置方法。您可以参考。
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use(async (ctx, next) =>
{
var jwt = ctx.Request.Query.Get("jwt");
if (jwt != null)
{
var userValidationResult = await Utility.ValidateUser(jwt);
if (userValidationResult.Validated)
{
var identity = new ClaimsIdentity("jwt");
foreach(var role in userValidationResult.Roles)
identity.AddClaim(new Claim(ClaimTypes.Role, role));
identity.AddClaim(new Claim(ClaimTypes.Email, userValidationResult.Email));
//etc... add every claim
ctx.Request.User = new ClaimsPrincipal(identity);
}
}
await next.Invoke();
});
var config = new HttpConfiguration();
app.UseWebApi(config);
//etc...
}
}