C# 重定向到URL而不是401,用于未经验证的
我正在使用ASP.Net 5 MVC 6和JWT令牌,这些令牌是在用户位于另一个站点(该站点是其子域)时创建的。我的目标是将令牌和请求一起传递到此子域。如果一个用户碰巧试图访问这个子域url,但在标题中没有正确的标记,那么我想将他们重定向到主站点登录页面 在对最新的RC-1版本感到非常失望之后,使用JWT令牌和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。以下是我的身份验证代码示例:
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);
}
};
});
说得好,谢谢,我两个都试试。我认为在这个解决方案中,服务器端的解决方案实际上可能更加优雅,因为一个简单的事实是,用户不会看到页面开始加载,然后重定向,即使这是一秒钟的时间。再次感谢