【问题标题】:Authorize Attribute Authentication with Postman in Web Api在 Web Api 中使用 Postman 授权属性认证
【发布时间】:2017-08-16 01:30:16
【问题描述】:

我正在使用 RESTful 服务,发现 Postman 是 GET、POST 和测试 API 的最佳插件之一。

我在 postman 中找到了 Basic Auth、No Auth、DIgest Auth、OAuth、AWS。如何测试授权控制器和方法。

我知道 Authorize 属性检查 user.Identity.IsAuthenticated

我不确定如何使用 Postman 在控制器和具有特定角色的方法中传递授权,如下所示

[Authorize(Roles = "Admin, Super User")]

public ActionResult AdministratorsOnly()
{
    return View();
}

这是我的启动文件

  public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

    public static string PublicClientId { get; private set; }

    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context and user manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Configure the application for OAuth based flow
        PublicClientId = "self";
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            // In production mode set AllowInsecureHttp = false
            AllowInsecureHttp = true
        };

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptions);         
    }

【问题讨论】:

  • web api 使用什么类型的身份验证提供程序?
  • 我认为默认身份验证是基本的。我没有对 Web Api 身份验证进行任何更改
  • 请分享Startup.Auth.cs或者authprovider的配置所在的启动类
  • @MarcusH 我发布了我的 startup.auth.cs
  • @chatra,您似乎正在使用 Windows 身份提供程序并使用 OAuth 2.0。而且您也不会在使用邮递员时发送角色。授权由框架根据用户声明处理。如果我误解了你的问题,请告诉我

标签: c# asp.net-web-api postman asp.net-web-api2


【解决方案1】:

看起来您正在使用 Windows 身份提供程序并使用 OAuth 2.0(默认为 web api 2 模板)。而且您也不会在使用邮递员时发送角色。授权由框架根据用户声明处理。

说明

当您使用您的用户名和密码向 /Token 端点进行身份验证时,您将获得一个不记名令牌和一个声明,其中包含您的身份信息,包括您的角色(更像是您的护照/ID)。您将使用您的不记名令牌来访问授权资源,并且您将根据与它关联的角色被授予或拒绝。

它是怎么知道的?

当您第一次启动应用程序时,在数据库中,asp.net 身份已自动创建用户、角色、externalLogin 等所需的表,前缀为 aspnet。您需要做的是创建一个用户,创建角色并将用户分配给具有 aspnet 身份提供的角色。 然后用 authorize 属性装饰你的资源,并用 postman 发出请求,只使用不记名令牌(成功登录 /token 端点时获得的令牌)

您可以参考here 以获得进一步的解释。

【讨论】:

    【解决方案2】:

    1.在 web api 中启用 CORS

    在 Startup.cs 配置方法中将以下内容附加到 IAppBuilder(如果遇到问题,请在此处阅读更多内容How to make CORS Authentication in WebAPI 2?)

    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    

    Nuget 包here

    2。通过 Postman 获取令牌

    3.使用令牌并从 web api 获取数据

    注意:令牌响应包含作为令牌的 access_token 和作为承载的令牌类型。在请求中使用时,在 Authorization http 标头的值之间添加一个空格。身份验证服务器将解析令牌并在请求命中所请求控制器中的 [Authorize] 属性之前设置 user.Identity

    此外,请确保 ApplicationOAuthProvider 将包含当前角色的声明身份添加到令牌中。否则请求将被拒绝。测试它的一种方法是只使用没有角色的 [Authorize] 属性,然后查看邮递员是否可以访问控制器

    【讨论】:

    • 没有授权属性,我能够从邮递员访问控制器和方法。我知道 cors,我认为我的问题与 cors 无关
    • @Chatra 如果您只使用 [Authorize] 而没有其中的角色规范。有用吗?
    • 不,它不适用于仅授权。我根本没有使用 MVC 控制器,我试图只调用 web api
    • @Chatra 并且您在向邮递员请求 api 时在 Authorization 标头中添加了不记名令牌?
    • 嗨@AlfMoh,通常你用编码语言创建一个api请求,比如javascript。然后您创建您的请求并将承载令牌附加为 http 标头,然后将其发送到服务器。如果您不告诉它们,浏览器不会存储信息。
    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2020-04-11
    相关资源
    最近更新 更多