Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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/4/oop/2.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# 如何使用ASP.NET Web API处理Javascript后端上的JWT客户端id_C#_Asp.net_Angularjs_Asp.net Web Api2_Jwt - Fatal编程技术网

C# 如何使用ASP.NET Web API处理Javascript后端上的JWT客户端id

C# 如何使用ASP.NET Web API处理Javascript后端上的JWT客户端id,c#,asp.net,angularjs,asp.net-web-api2,jwt,C#,Asp.net,Angularjs,Asp.net Web Api2,Jwt,我试图在一个项目中实现JWT授权。但是,为了成功获得令牌,我必须将客户端id从AngularJS前端传递到ASP.NET Web API后端,据我所知,这根本不安全。那么,有没有人能给我一个提示,在我的情况下,我应该做些什么呢 在JS方面- var data = 'grant_type=password&username=' + loginData.Email + '&password=' + loginData.Password + '&

我试图在一个项目中实现JWT授权。但是,为了成功获得令牌,我必须将客户端id从AngularJS前端传递到ASP.NET Web API后端,据我所知,这根本不安全。那么,有没有人能给我一个提示,在我的情况下,我应该做些什么呢

在JS方面-

var data = 'grant_type=password&username='
                    + loginData.Email + '&password=' + loginData.Password + '&client_id=' + client_id;
$http.post('/oauth2/token', data); //Code omitted
大部分情况下,我使用它来创建Jwt授权。除了我在一个域上有一个应用程序,下面是我的Startup.cs的样子-

public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();               
            config.MapHttpAttributeRoutes();    
            ConfigureOAuth(app);    
            ConfigureValidationOAuth(app);
        }

private static void ConfigureOAuth(IAppBuilder app)
        {
            var oAuthServerOptions = new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/oauth2/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
                Provider = new CustomOAuthProvider(),
                AccessTokenFormat = new CustomJwtFormat(ConfigurationManager.AppSettings["owin:issuer"])
            };

            app.UseOAuthAuthorizationServer(oAuthServerOptions);
        }   

 private static void ConfigureValidationOAuth(IAppBuilder app)
    {
        var issuer = ConfigurationManager.AppSettings["owin:issuer"];
        var audience = ConfigurationManager.AppSettings["owin:audience"];
        var secret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["owin:secret"]);

        //Api controllers with [Authorize] attribute will be validated with Jwt
        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AllowedAudiences = new[] {audience},
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                {
                    new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
                }
            });
    }

JWT身份验证和授权的工作原理如下:

  • 传递用户名并传递到服务器
  • 服务器检查用户数据并生成JWT令牌,该令牌应采用以下格式:(签出以获取更多信息)

    EYJHBGCIOIJIUZI1NIISINR5CCIKPXVCJ9.EYJZDWIIXMJ0Nty3ODKWIIBmFtzSi6IKPVAG4GrG9LiiWiyWrTaw4IonryDWV9.TJVA95或M7E2CBAB30RmHrHrHdCfXjoyZefH7HGQ

  • JWT令牌应该存储在本地存储器中的客户端

  • 为了让您的生活更轻松,您应该创建一个角度HTTP请求拦截器,该拦截器自动将保存的JWT令牌附加到请求头中。大概是这样的:
  • myApp.factory('jwt-interceptor',['$q','$window',函数($q,$window){
    返回{
    请求:功能(请求){
    request.headers['Authorization']='Bearer'+$window.localStorage.token;
    返回请求;
    },
    responseError:函数(response){
    返回$q.reject(响应); } }; }]).config(['$httpProvider',函数($httpProvider){ $httpProvider.interceptors.push('jwt-interceptor'); }]);

  • 服务器应读取名为
    Authorization
    的头参数,反编译令牌并检查负载是否:

    a。已正确反编译且有效负载完好无损

    b。检查有效负载中的到期时间戳是否大于当前时间戳

    c。其他与用户权限相关的检查(如果需要)


  • 我认为
    client\u id
    指的是请求令牌的软件客户端的id,而不是个人。我想您必须设置一个允许使用服务器进行身份验证/授权的软件客户端列表。顺便说一句,我建议使用来实现您的服务器,不要重新发明轮子,尤其是在处理身份验证/授权时。谢谢您的回复。所以,我只能将其存储在服务器端,对吗?感谢您的链接。客户端id主要用于避免未经授权的客户端使用您的身份验证服务器或针对特定客户端提出特定声明。例如,从client1进行身份验证的用户可能会从使用client2进行身份验证的用户那里得到不同的声明