C# OAuth2密码模式接口鉴权

发布于:2025-06-12 ⋅ 阅读:(19) ⋅ 点赞:(0)

项目场景:

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}");
    }
}