C# 在Web Api中使用邮递员授权属性身份验证

C# 在Web Api中使用邮递员授权属性身份验证,c#,asp.net-web-api,postman,asp.net-web-api2,C#,Asp.net Web Api,Postman,Asp.net Web Api2,我正在使用RESTful服务,发现Postman是获取、发布和测试API的最佳插件之一 我在《邮递员》中找到了基本授权、无授权、摘要授权、OAuth和AWS。如何测试授权控制器和方法 我知道Authorize属性检查user.Identity.isauthorized 我不知道如何使用Postman将authorize传入控制器和具有以下特定角色的方法 [Authorize(Roles = "Admin, Super User")] public ActionResult Administra

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

我在《邮递员》中找到了基本授权、无授权、摘要授权、OAuth和AWS。如何测试授权控制器和方法

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

我不知道如何使用Postman将authorize传入控制器和具有以下特定角色的方法

[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);         
    }
public static OAuthAuthorizationServerOptions OAuthOptions{get;private set;}
公共静态字符串PublicClientId{get;private set;}
//有关配置身份验证的详细信息,请访问http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder应用程序)
{
//将db上下文和用户管理器配置为每个请求使用一个实例
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext(ApplicationUserManager.Create);
//使应用程序能够使用cookie存储登录用户的信息
//以及使用cookie临时存储用户登录第三方登录提供商的信息
app.UseCookieAuthentication(新的CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
//为基于OAuth的流配置应用程序
PublicClientId=“self”;
OAuthOptions=新的OAuthAuthorizationServerOptions
{
TokenEndpointPath=新路径字符串(“/Token”),
Provider=新的ApplicationAuthProvider(PublicClientId),
AuthorizeEndpointPath=新路径字符串(“/api/Account/ExternalLogin”),
AccessTokenExpireTimeSpan=TimeSpan.FromDays(14),
//在生产模式下,设置AllowInsecureHttp=false
AllowInsecureHttp=true
};
//使应用程序能够使用承载令牌对用户进行身份验证
应用程序使用OAuthBealerTokens(OAuthOptions);
}

1。在web api中启用CORS

在Startup.cs配置方法中将以下内容附加到IAppBuilder(如果遇到问题,请在此处阅读更多)

Nuget包

2。通过邮递员获得代币

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

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


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

看起来您使用的是windows标识提供程序和OAuth 2.0(web api 2模板的默认设置)。而且在使用邮递员时也不会发送角色。授权由框架根据用户声明进行处理

解释

当您使用usename和密码对/Token端点进行身份验证时,将向您颁发一个承载令牌和声明,其中包含您的身份信息,包括您的角色(更像您的passport/Id)。您将使用您的承载令牌访问授权的资源,并且您将根据与之关联的角色被授予或拒绝

它怎么知道的?

在数据库中,asp.net标识自动创建用户、角色、外部登录等所需的表。。。当您第一次启动应用程序时,使用前缀aspnet。您需要做的是创建一个用户,创建角色,并使用aspnet标识将用户分配给角色。 然后,使用authorize属性修饰您的资源端点,并使用postman发出一个请求,其中仅包含承载令牌(您成功登录到/token端点时获得的令牌)


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

web api使用哪种类型的身份验证提供程序?默认身份验证是基本的。我没有对Web Api身份验证进行任何更改。请共享Startup.Auth.cs或用于配置authprovider的Startup类is@MarcusH我发布了startup.auth。cs@chatra,看起来您正在使用windows标识提供程序和OAuth 2.0。而且在使用邮递员时也不会发送角色。授权由框架根据用户声明进行处理。请允许我,如果我没有授权属性误解了你的问题,我可以从邮递员那里访问控制器和方法。我知道cors,我不认为我的问题在于cors@Chatra如果只使用[Authorize],而不使用角色规范。它能用吗?不,它不能用。我根本没有使用MVC控制器,我正在尝试调用web apionly@Chatra当从postman请求api时,您已经在授权头中添加了承载令牌?Hi@AlfMoh,通常您使用编码语言创建api请求,比如javascript。然后创建请求并在将其发送到服务器之前将承载令牌附加为http头。如果你不告诉浏览器,浏览器就不会存储信息。
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);