我正在使用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
???
答案 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);
}
};
});