Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过调用另一个服务使用JWT_C#_Asp.net_Asp.net Web Api_Owin_Jwt - Fatal编程技术网

C# 通过调用另一个服务使用JWT

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

下面介绍了使用.NETWebAPI在C#中创建和使用JWT的实现。然而,我正在努力使我当前的系统适应列出的任何教程

到目前为止,我一直在将JWT令牌作为查询字符串的一部分发送,如下所示:

…/api/users?jwt=aladsfjknasdfnjkladfskjlnajknjknfdsalnjksdfnjldf

我的路线是这样的:

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...
    }
}