WebApi +认证。怎么做?

时间:2016-07-29 22:12:33

标签: asp.net authentication asp.net-web-api owin

自从我创建自己的项目以来已经过去了几年,我正试图围绕着更新的做事方式。

现在我想要一个内置于reactjs的网站,将asp.net web api作为后端。

这将允许我将来制作移动应用程序和我想要的任何东西,因为一切都会通过我的网络API。

令我困惑的一件事是身份验证以及实际发生的地方。

我的应用程序的哪个部分正在进行身份验证?它是Web Api还是网站或两者兼而有之?

我的网站只支持ouath(google,facebook,Microsoft等),并且没有传统的登录屏幕。

用户可以通过他们的提供商(比如谷歌)来我的网页注册,然后被允许限制页面并开始做他们想做的任何事情(例如添加课程)。

当他们点击“创建”时,它会向我的api发出请求,在我的数据库中查找用户并查看他们是否有权创建新课程。如果是这样,让他们创建并保存它。如果不拒绝它。

如果他们没有登录并试图用邮递员打网页api,那么他们应该被拒绝。

我知道他们是Web api的OWIN,但我不知道我是否需要它,然后我的反应网站就像OWIN一样。

我也不想使用OWIN内置的数据库表,因为它似乎添加了我想要的更多功能(我只想授权用户)。

你可能会说我有点困惑。希望有人可以帮助我理解这一切。

2 个答案:

答案 0 :(得分:1)

这有点复杂,所以我要解释你要做什么。

1)首先使用OAuth提供程序。微软正在改进Identity Server。

身份服务器根据openid为您提供授权和身份验证。

2)身份服务器必须在另一个项目中编译,并在数据库中创建18个表来控制用户和您的客户。

客户端是具有访问权限的应用程序,例如Android应用程序,角度应用程序或资源服务器。根据您的应用程序,您必须选择工作流程。在身份服务器中,您可以选择5个

https://github.com/IdentityServer

标识服务器3用于asp.net mvc 4.5+,标识服务器4用于ASP.NET Core 1

我猜您的服务器将是资源服务器,因此如果您要保存用户帐户,则必须进行2次注册,在身份服务器中注册,然后在资源服务器中注册。

要配置资源服务器并了解两者之间的通信,必须使用以下内容配置StartUp.cs:

 public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            var clientId = (string)ConfigurationManager.AppSettings["oauth2.clientid"];
            var authority = (string)ConfigurationManager.AppSettings["oauth2.authority"];

            app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
            {
                Authority = authority,
                ValidationMode = ValidationMode.ValidationEndpoint,
                RequiredScopes = new[] { clientId },
            });

            app.UseResourceAuthorization(new AuthorizationManager());

        }


        private void ConfigureOAuth()
        {
            var formatters = GlobalConfiguration.Configuration.Formatters;
            var jsonFormatter = formatters.JsonFormatter;
            var settings = jsonFormatter.SerializerSettings;
            settings.Formatting = Formatting.Indented;
        }
    }

当您提供令牌并通过REST调用该服务时,您将在下一件事中发送您的http标头:

header.add("授权"," TypeToken令牌");

最常用的类型标记是Bearer

当您使用C#中的identity.client类进行登录时,身份服务器会提供此令牌,为您提供执行最难部分的强大工具。

配置客户端:

  private TokenClient GetTokenClient()
        {
            var clientId = (string)ConfigurationManager.AppSettings["oauth2.clientid"];
            var clientSecret = (string)ConfigurationManager.AppSettings["oauth2.client-secret"];
            var tokenEndPoint = (string)ConfigurationManager.AppSettings["openid.endpoints.token"];

            var client = new TokenClient(
                tokenEndPoint,
                clientId,
               clientSecret
            );

            return client;
        }

获取令牌:

Route("LoginOAUth")]
        [HttpPost]
        public async Task<TokenResponse> LoginOAUth(LoginViewModel credentials)
        {
            var result = await GetTokenClient().RequestResourceOwnerPasswordAsync(credentials.Correo, credentials.Password,
                            "offline_access AppNameExample-IdentityClient-morgan");

            return result;
        }

  public class LoginModel
    {
        public string Email { get; set; }
        public string Password { get; set; }
    }

此令牌必须由客户端存储,并且每次调用端点时,资源服务器都会对Identity Server进行内部调用,以检查您的令牌是否有效,以及您的令牌是否有效过期与否。

在令牌中,您获得了2种信息范围和声明,这些范围和声明向您说明了对资源的权利&#34;和id,email,name等用户数据信息。这里读取这些属性是自定义AuthorizationAttribute的一个例子:

  public class AuthorizationManager : ResourceAuthorizationManager
    {

        public override Task<bool> CheckAccessAsync(ResourceAuthorizationContext context)
        {

            switch (context.Resource.First().Value)
            {
                case "claims":
                    return AuthorizeValues(context);
                default:
                    return Nok();
            }
        }

        Task<bool> AuthorizeValues(ResourceAuthorizationContext context)
        {
            switch (context.Action.First().Value)
            {
                case "read":
                    return Eval(context.Principal.HasClaim("role", "api-read"));
                default:
                    return Nok();
            }
        }

    }

真的很复杂,我花了一个月的时间来研究OAuth 2.0协议以及如何运行身份服务器。祝你好运

答案 1 :(得分:0)

以下是您正在尝试执行的操作的完整教程,可帮助您更好地了解Web应用程序如何与.NET中的REST API进行交互

https://azure.microsoft.com/en-us/documentation/articles/active-directory-devquickstarts-webapi-dotnet/

现在您提到要将Google,FB,MSFT等用作身份提供商,因此我建议您查看以下微软刚刚提供的新产品。这使得将多个IDP(身份提供者)集成到您的应用程序中变得非常简单。它还有完整的代码示例,可帮助您入门。

aka.ms/aadb2c

仅供一般学习,我强烈建议您查看此链接,该链接解释有关令牌,OpenID Connect以及访问令牌内部内容的一些理论和基础知识。

http://connect2id.com/learn/openid-connect