项目场景:
asp.netFramework webApi
C# OAuth2密码模式接口鉴权
1.安装必要 NuGet 包
Install-Package Microsoft.Owin.Security.OAuth
Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Microsoft.AspNet.WebApi.Owin
2. 配置 OAuth 授权服务器
public class CustomOAuthProvider : OAuthAuthorizationServerProvider
{
// 验证客户端(可在此处校验 client_id/client_secret)
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
return Task.CompletedTask;
}
// 密码模式核心:验证用户名密码
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
// 1. 验证用户凭证(实际项目中替换为数据库验证)
if (!ValidateUser(context.UserName, context.Password))
{
context.SetError("invalid_grant", "用户名或密码错误");
return;
}
// 2. 创建身份声明
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
identity.AddClaim(new Claim(ClaimTypes.Role, "User")); // 添加角色
// 3. 创建附加数据(可选)
var props = new AuthenticationProperties(new Dictionary<string, string>
{
{ "client_id", context.ClientId ?? string.Empty }
});
// 4. 生成令牌
var ticket = new AuthenticationTicket(identity, props);
context.Validated(ticket);
}
private bool ValidateUser(string username, string password)
{
// 实际项目:此处查询数据库验证用户
return username == "admin" && password == "123456"; // 示例硬编码
}
}
3. 配置 OWIN Startup 类 (Startup.cs)
[assembly: OwinStartup(typeof(YourNamespace.Startup))]
namespace YourNamespace
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// 配置 WebAPI
var config = new HttpConfiguration();
WebApiConfig.Register(config);
// 配置 OAuth 服务器
ConfigureOAuth(app);
// 启用 WebAPI
app.UseWebApi(config);
}
public void ConfigureOAuth(IAppBuilder app)
{
var oAuthOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true, // 开发环境允许 HTTP
TokenEndpointPath = new PathString("/token"), // 令牌端点地址
AccessTokenExpireTimeSpan = TimeSpan.FromHours(1), // 令牌有效期
Provider = new CustomOAuthProvider() // 使用自定义提供程序
};
// 启用授权服务器
app.UseOAuthAuthorizationServer(oAuthOptions);
// 启用 Bearer Token 认证
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
}
4. 保护 API 控制器
[Authorize] // 要求认证
[RoutePrefix("api/protected")]
public class ProtectedController : ApiController
{
[HttpGet]
[Route("data")]
public IHttpActionResult GetSecureData()
{
var userName = User.Identity.Name; // 获取当前用户
return Ok($"安全数据,用户: {userName}");
}
}