IdentityServer,ASP.NET 核心和 Web API
IdentityServer, ASP.NET Core and Web API
我已经设置了 IdentityServer4 和另一个客户端 ASP.NET 核心应用程序。
客户端需要通过 IdentityServer 进行身份验证并请求访问第三个应用程序,该应用程序是标准 MVC Web API 项目。
我已按照此示例中的步骤实现客户端凭据流
https://identityserver.github.io/Documentation/docsv2/overview/simplestOAuth.html
现在我完全不知道如何让 WEB API 首先识别 Bearer 令牌,然后给我一些授权来访问 Web api 端点。
这是我的 IdentityServer Statrup.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
.AddInMemoryStores()
.AddInMemoryClients(Config.GetClients())
.AddInMemoryScopes(Config.GetScopes());
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(LogLevel.Debug);
app.UseDeveloperExceptionPage();
app.UseIdentityServer();
}
}
和Config.cs
public class Config
{
// scopes define the resources in your system
public static IEnumerable<Scope> GetScopes()
{
return new List<Scope>
{
new Scope
{
Name = "api1"
}
};
}
// clients want to access resources (aka scopes)
public static IEnumerable<Client> GetClients()
{
// client credentials client
return new List<Client>
{
// no human involved
new Client
{
ClientName = "Silicon-only Client",
ClientId = "silicon",
Enabled = true,
AccessTokenType = AccessTokenType.Reference,
AllowedGrantTypes = GrantTypes.ClientCredentials,
ClientSecrets = new List<Secret>
{
new Secret("F621F470-9731-4A25-80EF-67A6F7C5F4B8".Sha256())
},
AllowedScopes = new List<string>
{
"api1"
}
}
};
}}
ASP.NET 对 IdentityServer 和 Web 的核心调用 API
[Route("api/testing")]
public class TestingController : Controller
{
// GET: api/values
[HttpGet]
public IActionResult Get()
{
var responce = GetClientToken();
return Json(new
{
message = CallApi(responce)
});
}
static TokenResponse GetClientToken()
{
var client = new TokenClient(
Constants.TokenEndpoint,
"silicon",
"F621F470-9731-4A25-80EF-67A6F7C5F4B8");
return client.RequestClientCredentialsAsync("api1").Result;
}
static string CallApi(TokenResponse response)
{
var client = new HttpClient
{
BaseAddress = new Uri(Constants.AspNetWebApiSampleApi),
Timeout = TimeSpan.FromSeconds(10)
};
client.SetBearerToken(response.AccessToken);
try
{
var auth = client.GetStringAsync().Result;
return auth;
}
catch (Exception ex)
{
return ex.Message;
}
}
}
所以任何人都可以解释或分享一些关于我应该怎么做才能让 WEB APi(使用 owin 中间件)处理来自 ASP.NET 核心客户端的调用的链接?我应该在 Owin Configuration(IAppBuilder app) 方法中放置什么设置。
首先,您必须将 ScopeType 添加到 api-scope,
由于您的 API 正在处理资源,您需要添加 ScopeType.Resource 如果您想在 MVC 客户端显示同意屏幕,您还应该添加显示名称,如果您需要在 api,将它们添加到声明列表中:
new Scope
{
Name = "api",
DisplayName = "Your scopes display name",
Type = ScopeType.Resource,
Claims = new List<ScopeClaim>
{
new ScopeClaim("role")
}
}
在您的 api-项目中,您还必须添加一个 OwinStartup class,因为那是您告诉 api 使用不记名令牌授权的地方:
在启动配置中:
app.UseIdentityServerBearerTokenAuthentication(
new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "YourIdentityServersAddress.com/identity",
RequiredScopes = new[] { "api" },
});
app.UseWebApi(WebApiConfig.Register());
最后一行只是注册您的网络api-config。
那就是您指定权限的地方,即(这意味着)您的身份服务器和您在身份服务器启动文件中指定的范围。
如果您还想添加自定义授权管理器(例如,为特定角色授权,您需要在 API 的启动中的 "UseIdentityServerBearer..." 之前添加以下行:
app.UseResourceAuthorization(new AuthorizationManager());
其中 AuthorizationManager 是一个 class,您可以通过继承 class ResourceAuthorizationManager 自行实现。但我不想深入探讨这个问题(如果您对此有进一步的疑问,我很乐意深入探讨)
并且在您的 API 的控制器中,您只需在您不希望获得授权访问的方法上方添加 [Authorize] 属性class 级别,如果您的整个控制器都需要获得授权。 (如果你想使用例如角色身份验证,你需要 [ResourceAuthorize].
如果您还有其他问题或想知道,请随时提问
我已经设置了 IdentityServer4 和另一个客户端 ASP.NET 核心应用程序。 客户端需要通过 IdentityServer 进行身份验证并请求访问第三个应用程序,该应用程序是标准 MVC Web API 项目。
我已按照此示例中的步骤实现客户端凭据流 https://identityserver.github.io/Documentation/docsv2/overview/simplestOAuth.html
现在我完全不知道如何让 WEB API 首先识别 Bearer 令牌,然后给我一些授权来访问 Web api 端点。
这是我的 IdentityServer Statrup.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
.AddInMemoryStores()
.AddInMemoryClients(Config.GetClients())
.AddInMemoryScopes(Config.GetScopes());
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(LogLevel.Debug);
app.UseDeveloperExceptionPage();
app.UseIdentityServer();
}
}
和Config.cs
public class Config
{
// scopes define the resources in your system
public static IEnumerable<Scope> GetScopes()
{
return new List<Scope>
{
new Scope
{
Name = "api1"
}
};
}
// clients want to access resources (aka scopes)
public static IEnumerable<Client> GetClients()
{
// client credentials client
return new List<Client>
{
// no human involved
new Client
{
ClientName = "Silicon-only Client",
ClientId = "silicon",
Enabled = true,
AccessTokenType = AccessTokenType.Reference,
AllowedGrantTypes = GrantTypes.ClientCredentials,
ClientSecrets = new List<Secret>
{
new Secret("F621F470-9731-4A25-80EF-67A6F7C5F4B8".Sha256())
},
AllowedScopes = new List<string>
{
"api1"
}
}
};
}}
ASP.NET 对 IdentityServer 和 Web 的核心调用 API
[Route("api/testing")]
public class TestingController : Controller
{
// GET: api/values
[HttpGet]
public IActionResult Get()
{
var responce = GetClientToken();
return Json(new
{
message = CallApi(responce)
});
}
static TokenResponse GetClientToken()
{
var client = new TokenClient(
Constants.TokenEndpoint,
"silicon",
"F621F470-9731-4A25-80EF-67A6F7C5F4B8");
return client.RequestClientCredentialsAsync("api1").Result;
}
static string CallApi(TokenResponse response)
{
var client = new HttpClient
{
BaseAddress = new Uri(Constants.AspNetWebApiSampleApi),
Timeout = TimeSpan.FromSeconds(10)
};
client.SetBearerToken(response.AccessToken);
try
{
var auth = client.GetStringAsync().Result;
return auth;
}
catch (Exception ex)
{
return ex.Message;
}
}
}
所以任何人都可以解释或分享一些关于我应该怎么做才能让 WEB APi(使用 owin 中间件)处理来自 ASP.NET 核心客户端的调用的链接?我应该在 Owin Configuration(IAppBuilder app) 方法中放置什么设置。
首先,您必须将 ScopeType 添加到 api-scope, 由于您的 API 正在处理资源,您需要添加 ScopeType.Resource 如果您想在 MVC 客户端显示同意屏幕,您还应该添加显示名称,如果您需要在 api,将它们添加到声明列表中:
new Scope
{
Name = "api",
DisplayName = "Your scopes display name",
Type = ScopeType.Resource,
Claims = new List<ScopeClaim>
{
new ScopeClaim("role")
}
}
在您的 api-项目中,您还必须添加一个 OwinStartup class,因为那是您告诉 api 使用不记名令牌授权的地方: 在启动配置中:
app.UseIdentityServerBearerTokenAuthentication(
new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "YourIdentityServersAddress.com/identity",
RequiredScopes = new[] { "api" },
});
app.UseWebApi(WebApiConfig.Register());
最后一行只是注册您的网络api-config。 那就是您指定权限的地方,即(这意味着)您的身份服务器和您在身份服务器启动文件中指定的范围。 如果您还想添加自定义授权管理器(例如,为特定角色授权,您需要在 API 的启动中的 "UseIdentityServerBearer..." 之前添加以下行:
app.UseResourceAuthorization(new AuthorizationManager());
其中 AuthorizationManager 是一个 class,您可以通过继承 class ResourceAuthorizationManager 自行实现。但我不想深入探讨这个问题(如果您对此有进一步的疑问,我很乐意深入探讨)
并且在您的 API 的控制器中,您只需在您不希望获得授权访问的方法上方添加 [Authorize] 属性class 级别,如果您的整个控制器都需要获得授权。 (如果你想使用例如角色身份验证,你需要 [ResourceAuthorize].
如果您还有其他问题或想知道,请随时提问