Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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# 重定向到URL而不是401,用于未经验证的_C#_Asp.net Mvc_Asp.net Core_Asp.net Core Mvc_Jwt - Fatal编程技术网

C# 重定向到URL而不是401,用于未经验证的

C# 重定向到URL而不是401,用于未经验证的,c#,asp.net-mvc,asp.net-core,asp.net-core-mvc,jwt,C#,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,Jwt,我正在使用ASP.Net 5 MVC 6和JWT令牌,这些令牌是在用户位于另一个站点(该站点是其子域)时创建的。我的目标是将令牌和请求一起传递到此子域。如果一个用户碰巧试图访问这个子域url,但在标题中没有正确的标记,那么我想将他们重定向到主站点登录页面 在对最新的RC-1版本感到非常失望之后,使用JWT令牌和SecureKey代替证书。通过使用RC-2夜间构建版本,我终于让代码正常工作了。现在我的问题是,如果是未经身份验证的用户,我希望能够重定向到外部url。以下是我的身份验证代码示例:

我正在使用ASP.Net 5 MVC 6和JWT令牌,这些令牌是在用户位于另一个站点(该站点是其子域)时创建的。我的目标是将令牌和请求一起传递到此子域。如果一个用户碰巧试图访问这个子域url,但在标题中没有正确的标记,那么我想将他们重定向到主站点登录页面

在对最新的RC-1版本感到非常失望之后,使用JWT令牌和
SecureKey
代替证书。通过使用RC-2夜间构建版本,我终于让代码正常工作了。现在我的问题是,如果是未经身份验证的用户,我希望能够重定向到外部url。以下是我的身份验证代码示例:

        var key = "mysupersecretkey=";
        var encodedkey2 = Convert.FromBase64String(key);
        app.UseJwtBearerAuthentication(options =>
        {
            options.AutomaticAuthenticate = true;
            options.AutomaticChallenge = true;
            options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(encodedkey2);
            options.TokenValidationParameters.ValidIssuer = "https://tv.alsdkfalsdkf.com/xxx/yyy";
            options.TokenValidationParameters.ValidateIssuer = true;
            options.TokenValidationParameters.ValidAudience = "https://www.sdgfllfsdkgh.com/";
            options.TokenValidationParameters.ValidateAudience = true;
            options.Configuration = new Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration()
            {
                Issuer = "https://tv.sdfkaysdf.com/xxx/yyy"
            };
        });
现在我看到了其他使用OpedId的示例,它们非常简单,有一个名为
RedirectUrl

 app.UseOpenIdConnectAuthentication(options => {
    ...
    options.RedirectUri = "https://localhost:44300";
    ...
 });

您知道如何在使用
JwtBearerAuthentication
时设置
RedirectUrl

没有这样的属性,原因很简单:JWT承载中间件(类似于Katana中更通用的OAuth2中间件)是为API身份验证而设计的,而不是为交互身份验证而设计的。在这种情况下,尝试触发重定向对于无头HTTP客户端没有多大意义

这就是说,这并不意味着在某个时候你不能重定向你的未经验证的用户。最好的处理方法是在客户端捕获JWT中间件返回的401响应,并将用户重定向到适当的登录页面。例如,在JS应用程序中

如果您确信是正确的做法,您可以使用
OnChallenge
通知:

app.UseJwtBearerAuthentication(options => {
    options.Events = new JwtBearerEvents {
        OnChallenge = context => {
            context.Response.Redirect("http://localhost:54540/login");
            context.HandleResponse();

            return Task.FromResult(0);
        }
    };
});

说得好,谢谢,我两个都试试。我认为在这个解决方案中,服务器端的解决方案实际上可能更加优雅,因为一个简单的事实是,用户不会看到页面开始加载,然后重定向,即使这是一秒钟的时间。再次感谢