根据此 Microsoft 文档,您应该能够将 [RequiredScope("SomeScopeName")] 等属性应用到控制器级别或操作级别以保护 API。但是当我在 API 中尝试它时,它似乎根本没有任何效果 - 无论我使用什么范围名称(我确保令牌中没有该名称的范围),我总是正确的进入我应该失败的 API 操作。但与此同时,我的策略属性,例如 [Authorize(Policy = "PolicyName")],工作得很好。我缺少什么?
[ApiController]
[RequiredScope("AnyRandomName")]
public class MyApiController : ControllerBase
{
Run Code Online (Sandbox Code Playgroud)
更新
这是我的 Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
IdentityModelEventSource.ShowPII = true;
services.AddControllers();
services.AddSwaggerGen(opt =>
{
opt.CustomSchemaIds(type => type.ToString() + type.GetHashCode());
});
services.Configure<HostOptions>(Configuration.GetSection(HostOptions.HOST));
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
services.AddAuthentication("Bearer").AddJwtBearer(options =>
{
options.Authority = Configuration[HostOptions.IDENTITYGATEWAY];
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters …
Run Code Online (Sandbox Code Playgroud) 这是我第一次使用 Epicor 的 Prophet 21。在使用用户帐户进行身份验证后,我很难弄清楚如何在 HTTP 请求标头中传递令牌。
https://localhost:4443/api/security/token/?username= {USERNAME}&password={PASSWORD}
返回令牌,但我不确定应将请求标头设置为什么。我尝试过 Token、AccessToken 和一堆其他组合,但我总是收到此消息:
<TokenError xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Description>Token Validation Exception Occured</Description>
<Error>invalid_request</Error>
<Uri/>
</TokenError>
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试的示例:
https://localhost:4443/api/inventory/v2/parts/
标题
Token = token eoWffZR0PlReRLwHopOTNSoBccwj96VSkjGYX2QnGdLjqY10mREmjwh4GDXqpf7HBBHrFImN3T4RtHEPjBK+VQ5EniquqnBbOAvlzf+5amV3rKDB67w5XbyoOzD2YSiFOULoRRY2Iaxe7pAy5JaWQ==
Token = eoWffZR0PlReRLwHopOTNSoBccwj96VSkjGYX2QnGdLjqY10mREmjwh4GDXqpf7HBBHrFImN3T4RtHEPjBK+VQ5EniquqnBbOAvlzf+5amV3rKDB67w5XbyoOzD2YSiFOULoRRY2Iaxe7pAy5JaWQ==
Run Code Online (Sandbox Code Playgroud)
我不会包括更多的例子,但我已经尝试了各种组合。我还查看了非常无用的 SDK 文档。例如,这里是 JavaScript 代码示例,但它包含文档中没有的函数,因此我看不到它是如何构建请求的。
<script type="text/javascript">
var gToken;
function getTokenUI(){
var userName = $('#name').val();
var passWord = $('#password').val();
var jsonToken = getToken(userName, passWord)
gToken = jsonToken.AccessToken
$('#return ul').append('<li>' + gToken + '</li>');
}
function getOppUI() {
var oppID = $('#oppid').val();
var xhr = ajaxRequest("GET", OppResourceURL(oppID), null, "json", gToken); …
Run Code Online (Sandbox Code Playgroud) 我们有一个 ASP CORE 3 API 项目,我们需要使用 API 令牌来保护它。这些 API 令牌将从数据库中提供和加载,但作为概念证明,我们将进行硬编码以进行测试。我们查看的所有令牌授权都是指 JWT。我们不想使用 JWT。我们只是提供允许访问我们的 API 的 API 密钥 - 然后用户可以通过在标头中传递令牌来调用 API 方法,例如 X-CUSTOM-TOKEN:abcdefg。
如何修改 startup.cs 和管道,以便在每个请求上检查此 X-CUSTOM-TOKEN 标头?在正确方向上的简单点会很棒。
编辑:好的,这看起来是一个很好的开始!非常感谢!
您的示例似乎表明用户 API 令牌是用户令牌。我们的要求是我们需要一个 API Key 来使用 API,然后还需要一个 User Token 来调用某些控制器。
示例:myapi.com/Auth/SSO(通过API Token和User Information登录,返回User信息+User Token)
myapi.com/Schedule/Create(需要 API 令牌标头和带有用户令牌的标头)
您能否建议如何修改您的代码以支持这一点?
我是 springboot 的新手,并试图实现安全性,其中没有过滤器应用于我的登录、注册和主页 url。
我使用的是springboot 2.7.1
我希望antMatchers("/**/signup").permitAll()
不受任何安全过滤器的影响。
调试后,我发现我的注册网址被命中,用户详细信息被保存,但我的 AuthorizationFilter 也被执行。
这是我的 SecurityFilterChain :
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
AuthenticationManagerBuilder authenticationManagerBuilder=http.getSharedObject(AuthenticationManagerBuilder.class);
authenticationManagerBuilder.userDetailsService(userLoginService).passwordEncoder(bCryptPasswordEncoder);
AuthenticationManager authenticationManager=authenticationManagerBuilder.build();
http.csrf().disable().authorizeHttpRequests()
.antMatchers("/**/login").permitAll()
.antMatchers("/**/signup").permitAll()
.antMatchers("/home/**").permitAll()
.anyRequest().authenticated().and()
.addFilter(getAuthenticationFilter(authenticationManager))
.addFilter(new AuthorizationFilter(authenticationManager))
.authenticationManager(authenticationManager)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
return http.build();
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样。
authentication spring-security spring-boot api-authorization