对于未经身份验证的重定向到URL而不是401

时间:2016-01-06 09:36:48

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

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

对最新的RC-1版本感到非常沮丧,并使用带有SecureKey的JWT令牌代替证书。我终于通过使用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";
    ...
 });

在使用RedirectUrl时如何设置JwtBearerAuthentication ???

1 个答案:

答案 0 :(得分:5)

由于一个简单的原因,没有这样的属性: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);
        }
    };
});