【问题标题】:Redirect to URL instead of 401 for unauthenticated未经身份验证的重定向到 URL 而不是 401
【发布时间】:2016-04-10 08:17:05
【问题描述】:

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

在对最新的 RC-1 版本感到非常沮丧并使用带有 SecureKey 而非证书的 JWT 令牌之后。我终于通过使用 RC-2 nightly build 版本让我的代码工作了。现在我的问题是,在未经身份验证的用户的情况下,我希望能够重定向到外部 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 ???

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core asp.net-core-mvc jwt


    【解决方案1】:

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

    也就是说,这并不意味着您在某些时候无法根本重定向未经身份验证的用户。处理该问题的最佳方法是在客户端级别捕获 JWT 中间件返回的 401 响应,并将用户重定向到相应的登录页面。例如在 JS 应用程序中,this is usually done using an HTTP interceptor

    如果您真的确信 breaking the OAuth2 bearer specification 是正确的做法,您可以使用OnChallenge 通知来做到这一点:

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

    【讨论】:

    • 好点,谢谢,我两个都试试。我认为服务器端解决方案实际上在这个解决方案中可能更优雅,因为用户不会看到页面开始加载然后重定向,即使它是几分之一秒。再次感谢
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2020-02-22
    • 2019-07-27
    相关资源
    最近更新 更多