我必须在线程中保存一个令牌。CurrentPrincipal,以便随后将其传递给外部API,以免在此类应用程序中携带令牌。我检查令牌是否正确有效:
public class MyAuthenticationFilter : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext filterContext)
{
var authorization = filterContext.Request.Headers.Authorization;
if (authorization == null || authorization.Scheme != "Bearer" || string.IsNullOrEmpty(authorization.Parameter))
{
filterContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
return;
}
var principal = ValidateToken(authorization.Parameter);
if (!principal.Identity.IsAuthenticated)
{
filterContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
Thread.CurrentPrincipal = principal;
if (filterContext.RequestContext != null)
{
filterContext.RequestContext.Principal = principal;
}
}
public ClaimsPrincipal ValidateToken(string token)
{
SecurityToken securityToken;
return new JwtSecurityTokenHandler().ValidateToken(token, GetTokenValidationParameters(), out securityToken);
}
#region Private Methods
private static TokenValidationParameters GetTokenValidationParameters()
{
var identityServerUrl = StatiConfigurationService.Instance.GetValue("url");
var client = new HttpClient();
var res = client.GetAsync(identityServerUrl + "/.well-known/openid-configuration/jwks").GetAwaiter().GetResult();
var keyList = new JsonWebKeySet(res.Content.ReadAsStringAsync().GetAwaiter().GetResult()).GetSigningKeys();
var validation = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
ValidateIssuer = false,
TokenDecryptionKeys = keyList,
IssuerSigningKeys = keyList,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true,
ValidIssuer = identityServerUrl,
ValidAudience = "Vendor.Api",
ValidateAudience = true,
};
return validation;
}
#endregion
}
有什么办法可以保存我的令牌吗?
我在代币使用方面也有问题。。。
我在做JWT和Spring保安...
当我从邮递员那里运行它时,我收到了这样一条信息:
缺少所需的请求正文:公共org.springframework.http.响应实体
我的json正文:
"usuario": "yenny.muller",
"usuarioConexion": "yenny.muller",
"contraseniaConexion": "ymuller12345"
这是我的代码:
public class JWTAuthorizationFilter extends OncePerRequestFilter {
private final String HEADER = "Authorization";
private final String SESSION = "sesion";
private final String PREFIX = "Bearer ";
private final String SECRET = "mySecretKey";
public static final long EXPIRATION_TIME = 900_000; // 15 mins
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
try {
boolean resultado_checktoken = checkJWTToken(httpRequest, httpResponse);
if (resultado_checktoken) {
Claims claims = validateToken(request);
if (claims.get("authorities") != null) {
setUpSpringAuthentication(claims);
} else {
SecurityContextHolder.clearContext();
}
} else {
SecurityContextHolder.clearContext();
}
chain.doFilter(request, response);
} catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException e) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, e.getMessage());
return;
}
}
private Claims validateToken(HttpServletRequest request) {
//String jwtToken = request.getHeader(HEADER).replace(PREFIX, "");
String jwtToken="";
try {
jwtToken = this.getBodySession(request);
} catch (IOException e) {
e.printStackTrace();
};
return Jwts.parser().setSigningKey(SECRET.getBytes()).parseClaimsJws(jwtToken).getBody();
}
/**
* Authentication method in Spring flow
*
* @param claims
*/
private void setUpSpringAuthentication(Claims claims) {
@SuppressWarnings("unchecked")
List<String> authorities = (List<String>) claims.get("authorities");
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(claims.getSubject(), null,
authorities.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList()));
SecurityContextHolder.getContext().setAuthentication(auth);
}
private boolean checkJWTToken(HttpServletRequest request, HttpServletResponse res) throws IOException {
String authenticationHeader = "";
authenticationHeader = this.getBodySession(request);
if (authenticationHeader == null || !authenticationHeader.startsWith(PREFIX))
return false;
return true;
}
public String getBodySession(HttpServletRequest request) throws IOException {
String sbody = "";
HttpServletRequest servletRequest = new ContentCachingRequestWrapper(request);
//servletRequest.getParameterMap();
sbody = servletRequest.getReader().lines().collect(Collectors.joining());
String Field = SESSION;
String scampo = "";
if (sbody.contains(Field)) {
scampo = sbody.substring(sbody.indexOf(Field), sbody.indexOf("\n", sbody.indexOf(Field)))
.replace(Field + "\": \"", "").replace("\"", "").replace(",", "");
}
System.out.println("sbody: " + sbody + " sesion: " + scampo);
return scampo;
}
}
是否可以使用来自Google API客户端Javascript库的承载令牌来授权Google云存储桶,而无需向用户请求https://www.googleapis.com/auth/devstorage范围。该桶具有对所有Google帐户的读写访问权限。
我通过使用承载令牌实现了对SpringBoot API的授权,当登录成功时,该令牌被添加到响应的“授权”头中,然后需要通过React项目的登录获取方法读取该令牌,并添加到后续请求的“授权”头中。 不幸的是,虽然我被告知这是不可能使用Fetch,所以我现在试图重构我的登录功能,以便它返回响应正文中的令牌,而不是标题。 我不知道如何做到这一点,目前没有返回JSON正文对象,只有标头,我将不得不更改我的
我已经使用ASP.NET标识创建了承载令牌。在AngularJS中,我编写了这个函数来获取授权数据。 所以我想把这个令牌存储到浏览器cookie中。如果该令牌存在于此,则获取该令牌并从IIS服务器获取数据,否则重定向到登录页以登录获取新令牌。 类似地,如果用户单击注销按钮,它应该从浏览器cookie中删除令牌。 这怎么做?有可能吗?对用户进行身份验证和授权是正确的方式吗?如果有多个用户令牌怎么办?
问题内容: 我已经使用ASP.net Identity创建了承载令牌。在AngularJS中,我编写了此函数以获取授权数据。 所以 我想将此令牌存储到浏览器cookie中 。如果此令牌存在,则获取令牌并从IIS服务器获取数据,否则重定向到登录页面以登录以获取新令牌。 同样,如果用户单击注销按钮,则应从浏览器cookie中删除令牌。 这该怎么做 ? 有可能吗?验证和授权用户的正确方法吗?如果有多个用
我可以使用类似的代码和承载令牌进行GET,但似乎无法完成POST。 当我将Json、URL和承载令牌复制/粘贴到Postman中时,效果非常好。但从C#执行此操作时,会出现以下错误: “状态代码:400,原因短语:'错误请求',版本:1.1,内容:System.Net.Http.StreamContent,标题:{传输编码:分块连接:保持活动预期CT:最大年龄=604800,报告uri=”http
我在用阿斯匹林。网络应用程序 我很困惑。我已经使用JSON网络令牌。我明白这一点。已知经典的 JSON 网络令牌。标头、有效负载、签名、自包含。客户端可以查看索赔数据。 但是不记名令牌是什么呢?不记名令牌也是独立的。我们可以通过不记名令牌访问令牌的数据。客户端看不到索赔数据。 那我们为什么不使用不记名令牌呢?不记名代币不是标准吗?有没有像 JWT 持有者令牌这样的东西? 以及如何在 MVC Web