【问题标题】:Overload WEB API Token Controller重载 WEB API 令牌控制器
【发布时间】:2016-11-06 06:25:19
【问题描述】:

Visual Studio 为 ASP.NET WEB API 项目提供了一个很好的现成模板。我们有一组处理 ASP.NET 身份的帐户管理功能。但是,自动生成的控制器和文档都缺少一项最基本的功能。即用于授予 WEB API 访问令牌的“~/Token” URL 没有在任何地方提及。

我想编写一个自定义控制器来拦截所有“~/Token”调用,以类似于其他 WEB API 控制器的方式进行一些日志记录和附加处理。如何以简单自然的方式做到这一点?

【问题讨论】:

    标签: c# asp.net asp.net-web-api asp.net-identity


    【解决方案1】:

    看来您需要 OWIN OAuth 2.0 授权服务器。这是用于添加所需功能的 Microsoft 扩展。它创建一个可用于获取令牌的 oauth 端点(例如 /token)。你没有直接的控制器,但是有一个特殊的 OWIN 类连接到它,你需要扩展它来添加你需要的任何东西。

    您可以在herehere 找到更多详细信息。

    读起来有点长,但它确实有效,我已经在几个项目中使用过它。

    这是一个简单的例子(GrantResourceOwnerCredentials 对你来说是最重要的方法):

        public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
        {
    
            public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
            {
                // Add CORS e.g.    
                context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
    
                using (AuthRepository _repo = new AuthRepository())
                {
                    IdentityUser user = await _repo.FindUser(context.UserName, context.Password);
    
                    if (user == null)
                    {
                        context.SetError("invalid_grant", "The user name or password is incorrect.");
                        return;
                    }
                }
    
                var identity = new ClaimsIdentity(context.Options.AuthenticationType);
                identity.AddClaim(new Claim("sub", context.UserName));
                identity.AddClaim(new Claim("role", "user"));
    
                context.Validated(identity);
    
            }
        }
    

    【讨论】:

    • 感谢您的建议。此处提供的是标准 ASP.NET 标识链接。果然,我已经读了很多。但是没有人提到令牌入口点重载。因此我的问题。当然,OWIN OAuth 2.0 授权服务器已经包含在 Microsoft 模板中。问题是,是否有可能以一种简单的方式重载它来拦截令牌创建功能?
    • 这取决于您到底想要实现什么:向令牌添加一些附加信息? (简单),添加您的身份验证? (简单),更改令牌格式? (不知道)
    • 我想到了一些最简单的事情,例如添加用户通过WEB API登录的日志记录,或者可能对用户进行一些额外的验证,例如通过请求IP等。如果可以用几行代码完成,那就太好了。如果一定要自己写Authorization Server来实现,那绝对不值得。
    • 您可以在 OAuthAuthorizationServerProvider 的自定义实现中做所有您想做的事情。您可以在我提供的第二个链接(第 10 步)中找到更多详细信息。您可以在第 9 步中找到如何使用您的提供商
    • 谢谢。这正是我正在寻找的代码 sn-p。
    猜你喜欢
    • 2018-06-11
    • 1970-01-01
    • 2016-03-10
    • 2021-12-17
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多